You can draw a skyscraper because at it's core a skyscraper is an object that exists strictly in a 3 dimensional world.
Therefor you can convey a lot of important information about the skyscraper by showing it's shape and dimensions in an autocad drawing.
In reality however I expect that most skyscraper projects involve many many pages of writing and formulas in addition to the drawings.
OTOH a computer at it's core is a machine that sequentially follows instructions. So any description of a computer program must be able to reduce to this.
Since around the dawn of computer (or at least in the 10+ years I have been involved) there have been attempts to remove the requirement for computer programming, but in reality nobody has come close to anything as powerful as a programming language.
The most effective progress has been made via abstraction, where you allow one instruction to be used to imply many. For example making a REST API call with 1 line implies a lot of operations on a lower level (TCP/IP etc).
I think this is fundamentally because any system that you propose to replace a programming language will either be:
1) Turing complete, in which case it could be classified as a programming language itself and will require knowledge of algorithms/abstractions etc to operate effectively. This is where you end up with flowchart driven development tools where the flowchart ends up literally resembling a plate of spaghetti for any reasonably complex system.
2) Not Turing complete, in which case you lose a lot of power as there are things the system will not allow you to express and thus lose the ability to deal with many edge cases. Since you are developing software and not just using it, the reason for the development activity in the first place is probably to deal with some edge case than an off the shelf program does not.
When I was younger I used to play with various "code free" game development tools and ran into the same fundamental problem.
For example, I have a shooting game and when the player is hit with some projectile he takes some amount of damage based on the projectile he was hit with. This was usually very easy to do.
BUT then say I want to add an "armour" powerup to the game. If a player with the armour powerup is hit then he takes damage but at a reduced rate that is proportional to his armour value. The armour value is also reduced based on itself and the armour piercing value of the projectile which hits. However if the armour piercing value of the projectile is below some value proportional to the armour and health values combined then no damage is taken at all. Oh and the armour powerup cannot stack with certain other powerups except under some specific circumstances.
That type of logic was impossible to express with these tools, or required finding creative ways to abuse the tooling in ways not intended which would in turn make other functionality more difficult/impossible.
In reality however I expect that most skyscraper projects involve many many pages of writing and formulas in addition to the drawings.
OTOH a computer at it's core is a machine that sequentially follows instructions. So any description of a computer program must be able to reduce to this.
Since around the dawn of computer (or at least in the 10+ years I have been involved) there have been attempts to remove the requirement for computer programming, but in reality nobody has come close to anything as powerful as a programming language.
The most effective progress has been made via abstraction, where you allow one instruction to be used to imply many. For example making a REST API call with 1 line implies a lot of operations on a lower level (TCP/IP etc).
I think this is fundamentally because any system that you propose to replace a programming language will either be:
1) Turing complete, in which case it could be classified as a programming language itself and will require knowledge of algorithms/abstractions etc to operate effectively. This is where you end up with flowchart driven development tools where the flowchart ends up literally resembling a plate of spaghetti for any reasonably complex system.
2) Not Turing complete, in which case you lose a lot of power as there are things the system will not allow you to express and thus lose the ability to deal with many edge cases. Since you are developing software and not just using it, the reason for the development activity in the first place is probably to deal with some edge case than an off the shelf program does not.
When I was younger I used to play with various "code free" game development tools and ran into the same fundamental problem.
For example, I have a shooting game and when the player is hit with some projectile he takes some amount of damage based on the projectile he was hit with. This was usually very easy to do.
BUT then say I want to add an "armour" powerup to the game. If a player with the armour powerup is hit then he takes damage but at a reduced rate that is proportional to his armour value. The armour value is also reduced based on itself and the armour piercing value of the projectile which hits. However if the armour piercing value of the projectile is below some value proportional to the armour and health values combined then no damage is taken at all. Oh and the armour powerup cannot stack with certain other powerups except under some specific circumstances.
That type of logic was impossible to express with these tools, or required finding creative ways to abuse the tooling in ways not intended which would in turn make other functionality more difficult/impossible.