[HN Gopher] Programming breakthroughs we need
       ___________________________________________________________________
        
       Programming breakthroughs we need
        
       Author : panstromek
       Score  : 288 points
       Date   : 2022-08-17 12:03 UTC (10 hours ago)
        
 (HTM) web link (yoyo-code.com)
 (TXT) w3m dump (yoyo-code.com)
        
       | bawolff wrote:
       | I feel like a lot of boilerplate is a choice, that often comes
       | from frameworks being used.
       | 
       | I disagree with the text criticism as well. The reason we spend
       | time thinking and reasoning about code, is not because its text
       | format. Its because that's the job. We aren't scribes just
       | copying books. The hard part of programming is figuring out what
       | to do, not writing it out. Well i am sure better visualizations
       | or something could offer minor improvements to comprehending code
       | bases, i doubt it will change things significantly. We will
       | always spend most of our time trying to figure out what we need
       | to do not doing it.
        
         | jillesvangurp wrote:
         | Anything that feels repetitive, like writing boiler plate code,
         | is something that can, should, and probably will be automated
         | eventually. This is a constant if you are a programmer,
         | whatever you are doing today that is repetitive, you'll likely
         | be using some better way of doing that in the future. And as
         | Alan Kay says, the best way to invent the future is to invent
         | it. I'm always on the lookout for doing the same things with
         | less repetition.
         | 
         | Boiler plate usually results from people using something that
         | was not originally designed to do that thing or not designed
         | that well. It's indicative of some kind of design friction or
         | feature creep. When it works, people just do more of it without
         | really thinking about what they are doing or why. If you see
         | people copy pasting the same blobs of code over and over again,
         | that's a good sign something is wrong.
         | 
         | At some point that becomes the way things are done and people
         | start nit picking each other about doing it properly and then
         | inevitably somebody comes along and does a thing that is vastly
         | simpler and accomplishes the same thing. Happens over and over
         | again. Some people then inevitably resist that new way of doing
         | things because they are really invested in the old way. But the
         | way our industry works is kind of Darwinist; so those things
         | tend to die out quickly once something better comes along.
         | 
         | The two mistakes people in this industry make over and over
         | again is assuming that 1) they know it all and 2) things don't
         | change. Because things actually do change, and usually for good
         | reasons, the former requires work to stay true. Some skills
         | last longer than others and not all change is great. If you are
         | just coasting and writing the same stupid code over and over
         | again like it's ground hog day, it's going to eventually run
         | out on you.
        
         | Garlef wrote:
         | > I feel like a lot of boilerplate is a choice, that often
         | comes from frameworks being used. [...] I disagree with the
         | text criticism as well.
         | 
         | The representation as text files is also part of what's causing
         | the boilerplate.
         | 
         | As an example: How would you reduce the devops and
         | configuration boilerplate in a monorepo?
         | 
         | In your typical JS microservice, a lot of code is not actually
         | JS but yaml, json, terraform, etc. And it is very hard to
         | abstract these away since a lot of tools rely on the existence
         | of actual files.
         | 
         | Of course you can use code generation and other macros to
         | manage the units in your monorepo (nx.js does this). But this
         | is very instable since you might need to tweak some file
         | resulting in your macros not working any more.
         | 
         | My take would be that textual representation is a local
         | maximum. And our needs have outgrown this maximum. We're
         | spending 90% of our time to innovate to push the boulder up the
         | remaining 10% of this very hill. But there are most likely
         | other hills with a much higher peak.
        
           | treis wrote:
           | >In your typical JS microservice, a lot of code is not
           | actually JS but yaml, json, terraform, etc. And it is very
           | hard to abstract these away since a lot of tools rely on the
           | existence of actual files.
           | 
           | This is a problem of your own making, though. If you don't do
           | a microservice architecture in JS and do a modularized
           | monolith in Go, as an example, you don't have to write any of
           | this code.
        
       | graycat wrote:
       | Fundamental, foundational, unavoidable, overwhelming, invincible
       | but just dirt simple truth: Please sit down for this. And may I
       | have the envelope, please? Drum roll?
       | 
       | ===>>> In computing, meaning is crucial. Computer source code
       | doesn't mean anything. <<<===
       | 
       | Computer code obeys strict syntax rules, but those rules do not
       | give meaning.
       | 
       | So far, sorry 'bout this, essentially, to date, there is only one
       | good and significant approach to meaning -- writing in a natural
       | language, e.g., English. Did I mention, sorry 'bout that.
       | 
       | In simple, blunt terms, in well written code, the comments which
       | provide the meaning are more important, especially for
       | maintenance, than the actual code that gets executed. Sorry 'bout
       | that. Beyond that, beyond any doubt, far and away, in well done
       | software, the most important part is the well written
       | documentation. I should put this word _documentation_ in all
       | caps, ultra bold face, with flashing lights -- well written
       | documentation.
       | 
       | Sorry 'bout that.
       | 
       | For my code for my startup, early on I wrote out some
       | documentation in TeX, with the crucial core pure/applied math,
       | data handling, etc. Then I wrote some notes about the code. The
       | code is just awash in documentation, 100,000 lines of typing and
       | 24,000 programming language statements. Right, on average 4 lines
       | of typing for each programming language statement.
       | 
       | I had some external events pull me off the work of my startup,
       | but now I'm returning to it and finding my old documentation just
       | crucial, terrific. Even though it is all my project and code, I
       | still need all the documentation, and it works great -- let's me
       | understand again right away.
       | 
       | Don't believe me or argue with me. Instead, learn from D. Knuth
       | who has demonstrated very well that he is really good with
       | software. See what he did, and how and why, with his _literate_
       | programming -- more like reading a book in English about
       | something in engineering than just source code.
       | 
       | Right, long many software projects at IBM and the US DoD went
       | through stacks and stacks of layers of planning, requirements,
       | specifications, ..., before any code was written. Then for any
       | change, might have to go through the hundreds of pounds of paper
       | of the documentation to get it up to date again -- a real pain,
       | bottleneck, boat anchor to progress, etc. Right. Need a better
       | way. But apparently their documentation process was too _clumsy_
       | or some such. On the other hand, if the software is for an
       | airplane and it is you who is going to fly on that plane, then
       | maybe ....
       | 
       | Net, the meaning is crucial, and the code doesn't mean anything.
       | The meaning is in the documentation written in a natural
       | language, e.g., English. Sorry 'bout that.
       | 
       | One more point: We can try, but I see little hope soon. We can
       | try to design a programming language with syntax so _expressive_
       | that the meaning is automatically obvious and no more
       | documentation is needed. Did I mention I see little hope soon?
       | Sorry  'bout that.
        
       | jimnotgym wrote:
       | What I want is VB6 yet using Python to script. I also want it to
       | be cross platform.
       | 
       | We used to write whole gui programs in an evening, compile and
       | release them as an exe.
        
       | whatsakandr wrote:
       | A paradigm that Dave Farley has mentioned could be on the same
       | level as OOP or structured programming is a completely
       | asynchronous programming language. Every operation would have no
       | garunteee of executing immediately. Such a thing may unlock more
       | performance for cheaper on modern multicore cpus.
        
         | 082349872349872 wrote:
         | When we tried async-everything in the 1980's we discovered that
         | there is such a thing as too-fine grained parallelism: the
         | sweet spot (problem dependent!) is where communication and
         | computation are balanced.
        
       | AnthonBerg wrote:
       | Dependently typed programming languages:
       | 
       | * Solve a lot of these issues
       | 
       | * Exist
        
       | fegu wrote:
       | It sounds like he needs to try Haskell, or strong typed
       | functional in general. Less boilerplate, less testing, less worry
       | when changing code later.
        
       | teleforce wrote:
       | I'm surprised that the author did not even mention about GC and I
       | think it's another programming breakthrough after structured
       | programming.
       | 
       | Currently GC for compiled languages like Go and D (optional) are
       | considered as disadvantages rather than an advantages for high
       | performance systems.
       | 
       | Perhaps if we can get AI enabled GC that has good performance as
       | manual memory management in C++ and Rust it will be a genuine
       | breakthrough for modern programming languages.
        
       | zwkrt wrote:
       | There's a lot of complaining and not a lot of suggesting going on
       | in this article so I don't take it for very much. I feel like the
       | author got a job and realized that it almost exclusively involves
       | writing glue code and tests and looking at text diffs, so how
       | convenient to imagine a world where they didn't have to do the
       | boring parts of their job.
        
         | SKILNER wrote:
         | I think the author is identifying problems. Problems most
         | people just take for granted. I give the author credit for
         | that.
        
         | foolfoolz wrote:
         | very much agreed. i don't like the term glue code. when people
         | say glue what they usually mean is their applications specific
         | business logic
        
           | 082349872349872 wrote:
           | a Shannon-inspired taxonomy (note the _indefinite_ object;
           | ymmv):
           | 
           | - glue code: given the outputs, you can reconstruct the
           | inputs. this code translates between formats, between
           | systems, etc.
           | 
           | - parsley code: given the outputs, you _could_ reconstruct
           | the inputs. this code  "gussies up" its inputs: it takes
           | table rows to JSON, or JSON to framework objects, PDF, etc.
           | so in principle the original data is still there, but once
           | the outputs are sufficiently complex the inputs become
           | extremely awkward to reconstitute.
           | 
           | - crunch code: given the outputs, you have no hope of
           | reconstructing the inputs. this code does real computation,
           | and forgets stuff. Example: You can get a source program
           | given only an executable, but you won't get the source that
           | it was compiled from (nor will you, without a lot of work,
           | even get a source you're willing to read)
        
         | baobabKoodaa wrote:
         | I think you're being unnecessarily harsh. I get your point
         | about OP presenting problems, not solutions, but on the other
         | hand, they are a programmer & they are clearly trying to
         | automate the repetitive parts of the job. Isn't that basically
         | the essence of programming: what good programmers should be
         | doing is automating as much of their job as possible.
        
       | JoeAltmaier wrote:
       | So much right in that.
       | 
       | In the old days we had compilers linkers and loaders. They all
       | did the wrong thing. Compilers did text translation to semantics
       | and generated code. The linker combined code from several sources
       | and produced a loadable image. The loader checked for
       | compatibility and relocated an instance to an address.
       | 
       | Instead, the compiler should have stopped at semantics. The
       | linker should combine semantic modules into an abstract execution
       | model. The loader should generate code for the target machine at
       | the target offset.
       | 
       | We have some of that in different paradigms today. But still we
       | transmit far too much of lame abstraction in large wads, with all
       | the important semantics erased.
       | 
       | Sigh.
        
       | callinyouin wrote:
       | The whole "program is a model" part makes me think of Smalltalk's
       | image-based system. I never really got used to programming this
       | way myself, but I do think an image-based environment might check
       | some of the author's boxes. With the right tooling, a Lisp might
       | even be a decent choice.
        
         | Qem wrote:
         | For those wishing to experiment what a current image-based
         | development environment feels like, I recommend Pharo. Probably
         | is the most advanced open-source development environment in the
         | tradition of Smalltalk, available today. Main site:
         | https://pharo.org/ MOOC: https://mooc.pharo.org/
        
       | jrvarela56 wrote:
       | Something like Clojure inside Glamorous Toolkit (GTK) would make
       | me a happy camper. The discussion about text is a moot point bc
       | GTK makes it easier to create different visual representations of
       | your code. Clojure makes it easier to keep code as either basic
       | data types ([], {}) or functions without reaching for custom DSLs
       | which OO defaults to.
       | 
       | That and that everyone adopts it so there's plenty of libraries
       | and a community :D.
       | 
       | Seems like Clojure will get there with beefed up REPL workflows
       | ala Calva/Portal. Community is amazing rn but tbd how it 10-100x
       | (if ever).
        
       | probablypower wrote:
       | For me it is the separation of business logic and data from the
       | programming implementation.
       | 
       | Often the workflow in automating a work process is: - Worker has
       | intuition on how things work - Specialist starts automating and
       | running into exceptions, walls - Worker explains exceptions as
       | they're discovered - Specialist adds spaghetti to the 'clean'
       | business logic model they started with - This keeps going until
       | the end result looks like what the worker expects - The worker
       | then sees a datapoint they think is incorrect, but they can't
       | check it because the business logic is embedded in software,
       | code, database stored procedures, etc. - The specialist is then
       | called back into debug and resolve the issue.
       | 
       | At my workplace we run into this issue constantly, where the
       | ability to modify/adapt the business logic is lost through
       | automation, and it becomes obscured to the point that the
       | intuitive workers can't trust that the logical model is right.
       | 
       | There needs to be better separation of business logic from models
       | so that programmers don't need to 'dig' into business processes
       | and exceptions, and workers don't need to deal with part of their
       | responsibility being shoved into a black box that they're not
       | sure they totally trust or can adapt easily should a need arise.
        
         | csours wrote:
         | Wow. I would say the complete opposite. Why are you writing a
         | program for work unless you are helping to solve a problem? The
         | implementation only exists to work with business logic and
         | data.
         | 
         | Excel is an implementation that does not care about business
         | logic and data. Anyone can add their own business logic and
         | data.
        
           | probablypower wrote:
           | >Why are you writing a program for work unless you are
           | helping to solve a problem?
           | 
           | I'm not entirely sure what your point is here other than
           | implying that the programs I/we write aren't solving a
           | problem, which is not the case.
           | 
           | > The implementation only exists to work with business logic
           | and data.
           | 
           | This is true. I would say that any implementation of
           | automation is really an implementation of business logic that
           | turns one set of data into another. For example, taking
           | financial transaction data and using business logic to
           | convert this into data that measures company profitability.
           | 
           | > Excel is an implementation that does not care about
           | business logic and data.
           | 
           | Yes and no. Consider the example of transaction data ->
           | profitability measures. If you compute this in excel, you are
           | hand entering data (or using data inputs if you're not a
           | neanderthal) and you're inserting business logic into cell
           | formulas that relate to other cell formulas. Maybe you're
           | even using VBA. Business logic is embedded in the worksheet.
           | This is why you end up with a lot of small companies that
           | have "THE" accounting spreadsheet and "THE" inventory
           | management spreadsheet. It is the extent to which they can
           | automate.
           | 
           | I don't know if you've ever tried to detangle the business
           | logic from an excel spreadsheet, but it is a pain in the ass,
           | and it is very bug-prone. Tracking down bugs and errors in an
           | excel spreadsheet is spiritual torture.
           | 
           | > Anyone can add their own business logic and data.
           | 
           | I guess you may have read my post from the perspective of a
           | small company, where it is entirely feasible to store your
           | company's data and business logic in spreadsheets. I'm coming
           | from the perspective of a large enterprise where having excel
           | spreadsheets on the critical path of any business process is
           | a disaster.
        
           | akersten wrote:
           | That most of the business world lives and breathes Excel is a
           | testament to OP's point. Companies can cram whatever garbage
           | logic they like into a spreadsheet and no one has to call a
           | developer Microsoft because their pivot table isn't doing The
           | Business Thing that they expect - the end users simply have
           | the power to understand and fix the problem themselves.
        
             | csours wrote:
             | Sure, but then what is your job? Making Excel? No one needs
             | you to make Excel, it already exists.
        
         | panstromek wrote:
         | > the ability to modify/adapt the business logic is lost
         | through automation
         | 
         | This is a really interesting observation, I haven't thought
         | about it like that before.
        
       | mst wrote:
       | > If the text is just a view, it doesn't matter how it's written.
       | Let everybody customize it the way they want. I don't care if you
       | put opening brace on a new line, I don't even want to care.
       | 
       | Interlisp did this.
        
       | smallstepforman wrote:
       | I've been programming for over 30 years, and never been as
       | productive as before. Need to load and decode a jpeg/png, I grab
       | stb_image.h. Need to decode an ogg file, libogg. Need to
       | decompress, libz. Need to decode video, libavformat. Need
       | physics, libbullet. Need truetype fonts, freetype. Need a GUI,
       | Qt. Need SSL, libssl.
       | 
       | My day becomes selecting libraries, integrating them, and testing
       | integration. My business code is < 20% of our entire codebase.
       | And I'm much more productive in 2022 than in 1992.
        
         | lazyjones wrote:
         | And still you're typing repetitive text. My dad was punching
         | cards and able to read code from punched tape. I grew up
         | writing code on a home computer's display. And now, 35 years
         | later, it's long overdue that some visual NoCode tool should be
         | the default for mostly repetitive programming jobs. If I want
         | to build a Finder Quick Action to resize an image, for example,
         | I certainly won't open a C editor, I'll just use Automator.
        
         | dehrmann wrote:
         | You could have said the same thing 30 years ago because of the
         | C standard library. People used to hand-roll a lot of code you
         | get for free from it.
        
         | Supermancho wrote:
         | > Writing tests is time-consuming, usually doesn't scale, and
         | it easily creates tight coupling with implementations
         | 
         | After thousands of years, humans still use double accounting in
         | finance. This is because it's effective. Unsurprisingly, it's
         | tightly coupled to the original transaction recording.
         | 
         | The constant assertion that tight coupling is bad, because it
         | creates more work which can be error prone. This is a
         | fundamental problem with how people discuss software testing.
         | It's not a panacea, but a guardrail. Guardrails aren't
         | indestructible. That isn't the point. Developers have an
         | obsession with making things as easy as possible (be that
         | simplifying or codifying) and this is not a domain where that
         | makes for a better solution, all other qualities being equal.
        
           | panstromek wrote:
           | I think "double accounting" is a good analogy, and if you
           | look at it that way, some tests that look like the same thing
           | written twice in a different way start to make more sense.
           | 
           | The problem is just with effectivity - it'd be fine if the
           | time spent on test would be the same as time on code, but
           | very often the effort on test is much bigger while not even
           | covering all important cases. I think we need to look for
           | methods to get a good case coverage without spending majority
           | of our time writing tests.
        
         | whartung wrote:
         | > My day becomes selecting libraries, integrating them, and
         | testing integration.
         | 
         | Funny, being an old, cranky, gray-no-beard, if I wanted to
         | spend my days selecting libraries, integrating them, and
         | testing integration, I would have become a digital electronics
         | engineer.
         | 
         | Your point is well taken, it's just our modern truth. It's just
         | not was attracted me to this world in the first place.
        
         | swatcoder wrote:
         | That's funny because I feel like my day became cleaning up
         | those kinds of projects as their countless dependencies rot.
         | 
         | It feels anything but productive.
        
           | mynegation wrote:
           | What is your alternative then? Vendored-in dependencies with
           | their ossified security vulnerabilities? Or figuring out
           | homegrown code of dubious quality for the functionality that
           | is not core business of the company/product?
        
             | swatcoder wrote:
             | Nothing so dramatic. The alternative is judicious inclusion
             | of dependencies rooted in thoughtful, experienced
             | engineering.
             | 
             | Robust, comprehensive libraries from reliable vendors can
             | provide a lot of value and are slow to rot. These can be
             | anticipated and added early so that they're made good use
             | of and can become the first tool to reach for before adding
             | other dependencies. Think React, lodash, QT, boost, etc.
             | 
             | Meanwhile, I acknowledge that most other packages and repos
             | are of far more dubious quality than anything my team would
             | write, have no accountability to my team or stakeholders,
             | receive few/no code reviews when added or updated,
             | introduce conflicting style/semantic conventions, and
             | generally _expand_ the surface area for bugs and
             | vulnerabilities by including many lines of code that have
             | no relevance to the project.
             | 
             | There are no strict rules, but these are the sort of
             | considerations that weigh in.
        
               | riskable wrote:
               | > Robust, comprehensive libraries from reliable vendors
               | 
               | Hah! In all my years the biggest, most difficult
               | vulnerabilities/problems to remediate all came from
               | vendor-made (90% of the time closed source) software.
               | With the free, open source stuff the problems are usually
               | very minor but even if they're BIG we'll pretty much
               | always get fixes and deploy them faster than if we had to
               | wait on a vendor.
               | 
               | The more popular the OSS the safer it is but even niche
               | OSS tools/libraries are easier to work with by definition
               | because we can look at and modify the source to correct
               | the problem even if the original maintainer hasn't gotten
               | around to it yet. This is actually a big reason why
               | Python is preferred where I work: The code is
               | _inherently_ visible and fixable.
        
               | sleepybrett wrote:
               | ... thoughtful, experienced engineering like log4j?
        
               | chrismarlow9 wrote:
               | My experience in engineering tells me that vendors and
               | dependencies come and go and get acquired and all of them
               | develop their own set of problems over the years. I get
               | what you're saying, but you picked projects that are easy
               | to see as popular in hindsight, but not so much in early
               | adoption. Why react over angular? There is a problem with
               | picking vendors outside of just "picking the best" that
               | has multiple elements:
               | 
               | - Age of the company
               | 
               | - Complexity of integration with the vendor
               | 
               | - Stability in early adoption
               | 
               | If you adopt the tech too early, you risk instability
               | during a time where you don't have the size as a business
               | to afford that. Nobody that's a customer of Google is
               | going to leave their contract because it was down for an
               | hour. However your new 20 employee startup goes down for
               | an hour? And you just signed your largest customer yet?
               | And it's because you decided to early adopt some tech
               | because it simply "looks good and efficient?". No thanks,
               | that customer will be looking at alternatives when
               | renewal time comes, if they don't just pay out the
               | contract and leave on you already. And good luck getting
               | funding with that blemish that you blew it by adopting
               | cool new trends.
               | 
               | Okay, so being early adopter at a startup is risky. So
               | maybe you go with something that is "kind of" new, and is
               | being used by other large companies. Great, so you start
               | building, and the feature system grows, and the
               | integration grows, and now some new system comes along
               | that is way better. Think about life before
               | React/AngularJS and people who built systems with plain
               | jQuery. There was a time where that was the hottest thing
               | and nothing like React/Angular even existed. So you pick
               | that and then 3 years later you have piles of jQuery and
               | AngularJS/React/whatever else comes out, but remember the
               | maturity thing mentioned above. So now you watch it grow
               | over 2 years and now you have 5 years worth of jQuery and
               | the amount of work it will take to switch to
               | React/Angular is a year long project. You can't just stop
               | everything else to work on this, so it's 20% of your
               | time, nevermind that it's a moving target as you fix
               | bugs/release new things in jQuery over that year. So now
               | you're maintaining both for a year, and then 3 years
               | later it becomes clear that React is the winner over
               | Angular, and you picked the wrong one! At the time you
               | picked they both seemed pretty mature (Google w/Angular
               | and FB with React). Oh jeeze, do we migrate everything
               | again? And from the business perspective how do you even
               | begin to sell this to the people in charge when it
               | results in no benefits to the end user. And by the time
               | you finish it will these even be the tech you should be
               | using? Or will something else rise up to replace that?
               | 
               | The complexity grows with the integration as the age of
               | the company increases. And adding headcount and expecting
               | to solve the problem just introduces more problems. Now
               | your team size is 10 instead of 5 and standup is taking
               | an hour everyday, do you break it up into other teams?
               | What are those teams called? What if nobody wants to work
               | on the upkeep of the legacy? Why would they as an IC? So
               | now how do you split the work up fairly?
               | 
               | I'm not saying "don't use vendors", "don't adopt early"
               | or "don't vet your vendors", but what I'm saying is the
               | problem isn't the tech. It's the fact that the "obvious
               | correct solution" is a changing answer over time. And the
               | integration and added complexity combined with team
               | dynamics eventually becomes the hardest problem a company
               | has to solve.
        
       | revskill wrote:
       | We do have. It's ReactJS, or component composition on the
       | frontend.
       | 
       | On the backend, it's nothing new. Just use functions and problem
       | solved.
        
       | MarkSweep wrote:
       | RE: Program is a model
       | 
       | There are some more advanced refactoring tools now available.
       | These tools enable you to write code to detect bad code patterns
       | and even automatically fix them. You can use them to write one-
       | off transformations of code too. Rust has Dylint [1] and C# has
       | Roslyn Analyzers [2]. Facebook has tooling [3] that helps writing
       | CodeMods, enabling authors to generate changes for thousands of
       | files at a time.
       | 
       | The thing I really would like to see is a smarter CI system.
       | Caching of build outputs, so you don't have to rebuild the world
       | from scratch every time. Distributed execution of tests and
       | compilation, so you are not bottle-necked by one machine.
       | Something that keeps track of which tests are flaky and which are
       | broken on master, so you don't have to diagnose spurious build
       | failures. Something that only runs the test that transitively
       | depend on the code you change. Automatic bisecting of errors to
       | the offending commit.
       | 
       | [1] https://github.com/trailofbits/dylint
       | 
       | [2] https://docs.microsoft.com/visualstudio/code-
       | quality/roslyn-...
       | 
       | [3] one example: https://github.com/facebook/jscodeshift
        
         | EdSchouten wrote:
         | > The thing I really would like to see is a smarter CI system.
         | Caching of build outputs, so you don't have to rebuild the
         | world from scratch every time. Distributed execution of tests
         | and compilation, so you are not bottle-necked by one machine.
         | 
         | This is already achievable nowadays using Bazel
         | (https://bazel.build) as a build system. It uses a gRPC based
         | protocol for offloading/caching the actual build on a build
         | cluster (https://github.com/bazelbuild/remote-apis). I am the
         | author of one of the Open Source build cluster implementations
         | (Buildbarn).
        
       | coding123 wrote:
       | If an AI can now draw a rembrandt, then it's not far off that an
       | AI can read this:
       | 
       | Regular users are allowed to edit their own books.
       | 
       | Editors are allowed to edit any books with the same account id.
       | 
       | The public can read about any book that is not in draft status.
       | 
       | I need a domain model where users can write books with the
       | following properties: userId, accountId, title, author, status.
       | 
       | status is an enum supporting draft, published, no longer
       | available
       | 
       | I know this seems like a completely different paradigm, but I
       | think we were wrong about General AI needed to replace
       | programmers - we just didn't know how "normal AI" would go
       | without being General AI.
       | 
       | I can also see this extended into the front-end at least for
       | rudimentary forms. I can imaging someone doing a transfer AI to
       | make front-ends have a consistent and nice looking feel that can
       | change pretty easily - perhaps to match the user making the
       | request.
        
         | ElectricalUnion wrote:
         | > I think we were wrong about General AI needed to replace
         | programmers
         | 
         | So, the hard part of software is figuring out what you actually
         | need done.
         | 
         | You still need the person writing the system requirements to be
         | precise, accurate and not ambiguous, or you need General AI to
         | figure out if the supplied system requirements meets those
         | requirements.
         | 
         | And when things inevitably goes wrong, or requirements change
         | as they always do, "you just" have to review and rephrase your
         | entire requirement list, or you need General AI to do that for
         | you.
        
         | WJW wrote:
         | Assuming you mean that to be a rough draft for the spec of a
         | book management app, you wouldn't need an AI to parse that and
         | generate code. A simple DSL is enough and indeed the "spec" you
         | wrote could be implemented in about ten minutes with Rails,
         | devise and pundit. (I imagine most other popular backend webdev
         | languages have similar libraries available)
        
           | rmetzler wrote:
           | I wonder if the author of the blogpost ever tried Rails'
           | convention-over-configuration approach. It might be exactly
           | what he means when he says he gets to write less boilerplate.
        
       | bluesnowmonkey wrote:
       | Software reuse-in-the-small is a solved problem, but reuse-in-
       | the-large seems unsolvable. That's been the state of things for
       | decades.
       | 
       | Testing is hard because the requirement for correctness is often
       | absolute and inflexible. When software is allowed to be a little
       | incorrect, then yeah testing gets much easier.
        
       | jrm4 wrote:
       | Eh, unfortunately the one programming breakthrough the world
       | actually needs is one that would drastically change, and perhaps
       | harm, most of the people around here.
       | 
       | We need more "Excels." More and better tools that let "regular"
       | people program.
        
         | [deleted]
        
         | wokwokwok wrote:
         | I'm not going to argue whether the 'world actually needs' that,
         | or if people mostly, actually want that, or if, since excel is
         | already there if you want it, you probably don't have to write,
         | sell or build any more low code tools.
         | 
         | ...because, although I could argue about those points, it's
         | _fundamentally unrelated_ to the OP, and issue that programming
         | is hard, and, for a very long time, no one has really had _any
         | idea_ how to solve it.
         | 
         | Now, however, AI generated code (like copilot) is, for the
         | first time in a long time, a potential avenue to actually
         | change how software is created at all levels.
         | 
         | I think there's pretty interesting, because it opens up a lot
         | of new opportunities.
         | 
         | Is the future dynamic languages / high level specifications
         | that are AI-transformed into typed verbose languages like
         | C/Rust/whatever and then compiled?
         | 
         | The ancient tools like Rational Rose tried to do this, but the
         | tech was never actually technically good enough. Maybe... we'll
         | see a real change in this space as the sophistication of the
         | models improves... or maybe, like self-driving cars, it's
         | always going to be 'nearly good enough'.
         | 
         | Hard to say.
         | 
         | ...but, hot damn. More excels? Please no. Excel already exists.
         | Don't rebuild that stuff again. Build new, different
         | interesting tools please.
        
           | sdf4j wrote:
           | >Is the future dynamic languages / high level specifications
           | that are AI-transformed into typed verbose languages like
           | C/Rust/whatever and then compiled?
           | 
           | How is that different from the present? Why are these "AI-
           | transformations" different from what a compiler can do?
        
             | wokwokwok wrote:
             | A compiler cannot take arbitrary high level descriptions
             | and generate code.
             | 
             | You've seen copilot right?
             | (https://github.com/features/copilot)
             | 
             | It's fundamentally more sophisticated. This is like asking
             | what is the difference between modern ML translation and
             | the previous 20 years of research on language translation;
             | the former actually works.
             | 
             | The latter basically doesn't except in very specific
             | circumstances.
             | 
             | Compilers can turn language into instructions only in a
             | limited extremely specific set of circumstances.
        
           | ziddoap wrote:
           | > _...but, hot damn. More excels? Please no. Excel already
           | exists. Don 't rebuild that stuff again._
           | 
           | I don't think they literally meant another Excel. Just
           | something that is easily accessible and usable by non-
           | programmers to do very 'programmy' things, etc.
        
             | sleepybrett wrote:
             | This argument also just assumes, 'anyone can sit down and
             | use excel'. Which is not true, excel has a learning curve
             | like anything else, most people learn 'just enough' to do
             | their job, maybe there is a guy in their office that knows
             | a little bit more and they can learn from them. But excel
             | proficiency acquisition is very similar to a programming
             | proficiency acquisition, maybe the track runs out faster
             | (at some point you reach real diminishing returns and
             | limits to a spreadsheet's capabilities but I've seen some
             | insane shit written in excel, raytracers for instance, but
             | no-one who has done that thinks it's a good idea.)
        
               | ziddoap wrote:
               | > _excel has a learning curve like anything else,_
               | 
               | Agreed.
               | 
               | > _But excel proficiency acquisition is very similar to a
               | programming proficiency acquisition_
               | 
               | Strong disagree. Maybe if you only consider those extreme
               | cases you referenced (ray-tracing, heavy VBA, etc.),
               | sure. But in general? No shot.
               | 
               | Excel gives immediate feedback with a visual interface.
               | There's no need to learn about variables or syntax or
               | memory or compiling. There's no dependencies and no
               | package managers. It abstracts nearly everything away.
               | Click the place you want the thing to go, type the thing.
               | Want a chart? Click the picture of the chart you like and
               | click and drag over what you want in the chart. Want to
               | change chart colors? Click the color you want. Want to
               | change how the data is displayed visually? Press the bold
               | button, or the color button, or the border button,
               | whatever your heart desires is a click away with the same
               | interface your used to with Word.
               | 
               | A great comparison is a geographic heatmap. In Excel, you
               | need 2 columns. One with some States/Provinces and the
               | other with some numbers. Then you click the big map
               | button and instantly have your map. I can write the
               | instructions for it in the space of a napkin and someone
               | who has never touched Excel can be making all the maps
               | they want. Now think about how you would explain making
               | the same geographic heatmap in Python (or whatever your
               | 'easy' language of choice is) to someone who has never
               | learned any programming concepts.
        
               | barnabee wrote:
               | The amazing thing about Excel is that many (most?) people
               | start using it without EVEN knowing how to make a simple
               | formula.
               | 
               | They literally start using it as a way to lay out tables
               | (usually of data). Then they make graphs. And add more
               | tables. And learn how to use it like a basic pocket
               | calculator (half of the formula I see that should be sums
               | are actually =B21+B22+B23+B24+B25...) Then comes SUM.
               | Then VLOOOKUP. Perhaps some IFs or COUNTIFs.
               | 
               | This process can take _years_ for someone to go from
               | first use to anything even slightly programming-like, if
               | you squint at it.
               | 
               | A tiny fraction of these people ever do anything complex
               | enough it looks even much like low-code or no-code
               | "development". Even less write macros.
               | 
               | But you know what? In the first half hour, when all they
               | wanted was to email round a list of team members and
               | their lunch preferences, they _already_ achieved
               | something with Excel that they found useful, and they
               | felt productive ever since. Most Excel users spend almost
               | NO time learning the tool compared to how much time they
               | spend getting (what they see as, and what probably is)
               | value out of it, even when we are sat in sheer terror as
               | we witness the horror they have unleashed on the world.
               | 
               | That is the bar you have to clear to make a "better
               | Excel".
        
           | ffhhj wrote:
           | They mean no-code or low-code tools, but those come with a
           | large hidden layer. These tools are known for making the 80%
           | easy and the other 20% impossible. Excel can also become a
           | mess.
        
           | jrm4 wrote:
           | Yeah, I was using Excel as shorthand for "simple enough yet
           | powerful enough tools such that someone who is perhaps an
           | expert in something else can build themselves something
           | useful."
        
         | solomatov wrote:
         | >More and better tools that let "regular" people program.
         | 
         | There's one catch with Excel, the more complicated your
         | spreadsheet gets, the closer it gets to programming. And at
         | some point, it's more cost effective to write in a proper
         | programming language than continue to maintain mess.
         | 
         | However, until this complexity level, Excel is great, and
         | empowers a lot of people who barely know the basic features of
         | Excel to solve their computational problems.
        
         | surement wrote:
         | You can already have "regular" people as software engineers if
         | you follow basic concepts like the SOLID principles.
         | Unfortunately many engineers are incredibly smart and they
         | don't see the difference between writing spaghetti code with
         | cryptic names and writing clear, legible code that normal
         | people can follow. I've worked with people that could figure
         | out a program written in binary if they needed to, but that
         | meant that they never learned to write structured, sensible,
         | readable programs.
        
         | mamcx wrote:
         | This is a good take, but easy to misunderstand.
         | 
         | The main problem is that MOST "programming"
         | languages/environments are not made for business apps, (or for
         | other niches, btw).
         | 
         | Python? Ruby? Julia? Delphi? all fail to work to make(or solve
         | even small cases of) _business apps_.
         | 
         | By a long mile.
         | 
         | -----
         | 
         | What Excel solves, is have a barebones, half-working,
         | unscalable, ill-suited... BUT MADE FOR help people get a
         | "solution" for this.
         | 
         | Things that are more like this are Django, Jupyter notebooks, a
         | little of Julia, FoxPro. But still are more pro-developer than
         | pro-power-user.
        
         | dehrmann wrote:
         | I was agreeing with you, but as I thought about it, I
         | remembered MS Access. It is used, often ships with Office, but
         | still isn't close to as popular as Excel. Either the model is
         | wrong, or the need isn't there.
        
           | ElectricalUnion wrote:
           | In my experience, the main problem is that while Excel
           | "distributed code versioning" with a whole bunch of copies
           | around is awful, Access databases are not only much more
           | prone to corruption and data loss in general (even in single
           | user, non-simultaneous ideal use cases, never mind people
           | attempting to multiplayer edit it over network shares...),
           | it's often very hard for non-programmers to get any insights
           | on any data you threw on it without using Excel in the first
           | place.
           | 
           | So if the data is coming from Excel, and being extracted back
           | to Excel, why use anything besides Excel?
        
           | mrguyorama wrote:
           | Access used to be pretty standard for a small business trying
           | to improve their situation, but we in the software
           | development world spent so much time trying to work around
           | limitations of Access and upgrading growing businesses out of
           | Access that we took it personally and shouted to everyone not
           | to use Access.
           | 
           | However, it is still taught in IT classes as a useful tool
           | for small businesses, and it is.
        
             | codereviewed wrote:
             | My very first paid web gig was connecting a small business'
             | Access based product catalog to their website. I was 14 or
             | 15 at the time. I was able to do it with out any real
             | coding knowledge except for some basic HTML I learned from
             | MySpace and some copy-paste VBScript, haha. The site was a
             | hit and I made $1,200 and immediately spent it all on an
             | electric guitar.
        
           | jrm4 wrote:
           | MS Access isn't as good. Again, e.g. Hypercard.
        
           | staindk wrote:
           | MS Access has awful UX. I've used it on and off over the
           | years and can never find my 'flow state' as nothing in that
           | program seems to flow at all.
           | 
           | If MS prioritised working on it it may have helped lift some
           | people out of Excel and into DBA-lite territory but not in
           | its current state.
        
         | PeterWhittaker wrote:
         | Excel programming errors cost business $$$
         | https://www.cnbc.com/amp/id/100923538
        
           | swatcoder wrote:
           | Engineering salaries cost business $$$ too. And still
           | introduce costly errors of their own.
        
           | ta988 wrote:
           | The question is not just how much Excel costs, it is how much
           | revenue it helps bring in. And in many places, it brings more
           | than it costs. Nothing is worse than a poorly designed webapp
           | that was supposed to solve the "Excel problem" in a process.
        
           | genghisjahn wrote:
           | You're right. All business should get rid of spreadsheets to
           | save money.
        
             | pessimizer wrote:
             | We can't blame spreadsheets for the cited errors, because
             | they're errors in arithmetic rather than Excel bugs. All
             | businesses should get rid of arithmetic.
        
           | rileyphone wrote:
           | Many more such cases [0], but Excel and spreadsheets in
           | general also save businesses $$$$$, which explains their
           | pervasiveness. Calculations take a long time and are easier
           | for a human to mess up, which is why the initial spreadsheets
           | were so popular as to drive the adoption of the personal
           | computer in general [1]. The gulf between Excel and Python is
           | pretty obvious, but there recently there have been few with
           | their sights set on it, as most programmers looking to
           | improve programming do so from their own experienced vantage
           | point.
           | 
           | [0] http://www.eusprig.org/horror-stories.htm
           | 
           | [1] https://www.wired.com/2014/10/a-spreadsheet-way-of-
           | knowledge...
        
         | spikej wrote:
         | Or more realistically the rapid application development tools
         | need to be better so we're not bogged down dealing with latest
         | fad or resume driven development
        
           | jimbob45 wrote:
           | What more do you want beyond Wix and VB.NET? People just
           | don't use RAD stuff anymore because...well I don't know why.
        
           | vsareto wrote:
           | There's not much reason to improve things. No one's out here
           | saying "you don't get this job because you chose new
           | technologies when they weren't needed".
           | 
           | Even if you can equate glue code with trash, we seem to have
           | unlimited space or a black hole to throw that trash.
        
         | immigrantheart wrote:
         | Why would it harm us? We are problem solvers, we can use our
         | intellect somewhere else. Programming is just a tool.
         | 
         | A lot of my colleagues are hybrid of traders + programmers.
         | They do a lot of Excel. Sure, we can automate text programming,
         | let everyone do Excel, and us problem solvers still won't find
         | difficulties finding high paying job.
        
           | jrm4 wrote:
           | I wish every programmer held this sentiment and I'm guessing
           | most don't
        
         | whartung wrote:
         | I'm a firm believer in empowering end user automation. The
         | atrocities that folks cobble together with the Excels of the
         | world are a marvel, and more power to them.
         | 
         | But in the end, we all talk about leaky abstractions, and the
         | stark horror is that the fact that all of these wonders run on
         | a computer, the worlds leakiest abstraction, the worlds most
         | stubborn, pig headed, cantankerous contraption out there.
         | 
         | And all the lipstick in the world can't hide it.
        
         | SKILNER wrote:
         | Regular people have their regular jobs to do. They want to use
         | tools, not build them.
         | 
         | I'm all into PowerApps and all that, but no-code for anything
         | the least bit sizable or complex is a fantasy from citizen
         | developers.
        
           | conradev wrote:
           | It is not a fantasy for small businesses, who rely on
           | internal tools and processes to operate. These tools solve
           | real pain points for them and that is why they exist and why
           | it is a fast growing market.
        
             | halfmatthalfcat wrote:
             | It's a lot of hype right now, not necessarily indicative of
             | staying power. We've been through multiple bouts of "no-
             | code/low-code will replace X" and it has never materialized
             | in any meaningful way.
        
               | conradev wrote:
               | Zapier has been around for a decade at this point and has
               | shown continuous, revenue-driven growth
        
         | thrown_22 wrote:
         | >We need more "Excels." More and better tools that let
         | "regular" people program.
         | 
         | The only reason why more people don't program is because
         | Windows is antithetical to programming _anything_. The second
         | you remove people from a windows environment is the moment they
         | start coding, even by accident.
        
         | dkottow wrote:
         | True, but just using Excel does not lead to decent data models,
         | though. IMHO, what we _would_ need is for  "regular" folks to
         | grasp the basics of relational database first (at least 1:n and
         | n:1) and then build an easy to use excel-like tool around it.
        
       | samsquire wrote:
       | I work on this problem everyday, I am at 450+ journal entries of
       | thoughts from concurrency, parallelism, desktop environment
       | behaviour and programmatic expression. (see my profile)
       | 
       | I am working on the expression problem at this time.
        
       | enriquto wrote:
       | Just give me modern and complete hardware drivers for plan9.
        
       | ecopoesis wrote:
       | I would love to see a language that considers tooling a first
       | class problem. Most (all?) languages barely consider complex
       | projects with 100s of dependencies and large multi-step builds.
       | Java shouldn't have to wait for Maven and Gradle to come along,
       | and Python shouldn't be shackled to piss-poor systems like pip.
       | 
       | This is something Rails gets very right. Bundler and Rake make
       | Rails one of the nicest development environments there is.
       | 
       | But we can and should do better. Why is DLL-hell still a thing?
       | Imports should specify versions, defaulting to a default if none
       | is specified. Languages barely even consider versions today, they
       | are almost always hacked on via magic text strings in filenames.
       | 
       | Why do tools like Dependabot and Renovate need to parse a million
       | dependency formats to figure out versions? The language runtime
       | or build system should produce that as a first class output.
       | 
       | Deployment and documentation are other places most languages
       | ignore and delegate to a variety of crappy external tools.
       | 
       | Build Server Protocol is a good step in the right direction, but
       | it barely scratches the surface. It would be great to see a
       | language that prioritizes the parts of the developer experience
       | that aren't writing code.
        
         | [deleted]
        
         | [deleted]
        
         | plafl wrote:
         | >But we can and should do better. Why is DLL-hell still a
         | thing? Imports should specify versions, defaulting to a default
         | if none is specified. Languages barely even consider versions
         | today, they are almost always hacked on via magic text strings
         | in filenames.
         | 
         | So suppose you fix the version number when you import the
         | library. You then need to copy paste the version number to
         | other imports in your code base? Or maybe you mean each import
         | may have different versions? which is all right until you need
         | to pass some data between two versions of the same library.
         | This wouldn't be so difficult if semantic versioning or another
         | equivalent was respected, but we know it's a lie. This wouldn't
         | be a problem at all if there were some kind of contracts in
         | place when using modules/package/whatever instead of a silly
         | number based on convention but how to specify the contracts is
         | not that easy, and it's similar to say having static typing. I
         | think improving versioning it's doable but it's very hard.
         | 
         | I'm all about improving tooling, I have been obsessing for a
         | few months about the sad state of program documentation and
         | navigation. Why is the computer doing nothing while I think so
         | hard while I'm programming? Why there is so little money in
         | this space?
        
         | solomatov wrote:
         | Go and Rust with go and cargo commands correspondingly have
         | great tooling in this respect. As long as you use one language,
         | everything is very convenient.
        
       | alexashka wrote:
       | This to me sounds like someone whose job it is to dig holes and
       | fill them back in, asking for an improved shovel, or exercises
       | for his lower back.
       | 
       | There is nothing wrong with improving shovels, exercises are
       | great.
       | 
       | But _why_ are we digging holes? :)
       | 
       | What does using a modern subset of C++ prevent us from achieving,
       | that we really want? Are programming tools the bottleneck of
       | modern society?
       | 
       | Do we really need 100s of computer games released each year,
       | 1000s of funded start-ups trying to become unicorns, a
       | 'metaverse'? Do we need all that? Or would we rather have UBI,
       | land value tax and enough sanity in society so that women choose
       | to have children again?
       | 
       | You tell me :)
       | 
       | If you say 'we can have both', can we really?
        
       | feoren wrote:
       | So, so much is misguided about this article. Yet, the opinions
       | expressed are actually quite common, and I think represent some
       | widespread and fundamental misconceptions about software
       | development, so they're worth addressing. Apparently this comment
       | was too long for HN, so I'll address the points individually in
       | child comments to this one.
        
         | feoren wrote:
         | > Most code I write doesn't do anything interesting, it's
         | either some boilerplate or glue for connecting subsystems
         | together.
         | 
         | That's _your fault_. There 's not some line where "interesting
         | code" lives on one side and "boring glue code" lives on the
         | other. I agree that you don't want boring glue code, but you
         | also don't want highly interesting code either! Every block of
         | code should be "mildly interesting": doing about one
         | interesting thing. Your job is to evenly spread the intrinsic
         | complexity of the problem over code blocks to make this happen.
         | If you're writing boring glue code that doesn't solve part of
         | the problem interspersed with highly interesting code that
         | handles 15 different cases, your code is lumpy!
         | 
         | So many people talk about spending too long on boilerplate glue
         | code, but you're stitching _this part_ and _that part_ of the
         | code together for a reason -- for a reason that can be
         | expressed in domain logic and user stories -- _right_? (If not,
         | you truly are wasting your time, but that 's only because that
         | whole code block doesn't deserve to exist.) So express the
         | reason for stitching that code together in the glue code, and
         | now it's mildly interesting, just like all of your code should
         | be.
         | 
         | It blows my mind that the same people who complain about over-
         | abstraction also complain about spending too long in the weeds
         | of boilerplate code. You're so used to _bad_ abstractions that
         | you 've given up, and then you whine "why can't I do this at a
         | higher level!?" Because you've _stopped trying_ , that's why!
         | Learn to write better abstractions, and keep tweaking them when
         | they become awkward. Finding a good abstraction is _really
         | hard_ , but absolutely worth it when it happens. And there are
         | meta strategies you can learn to make it easier.
        
         | feoren wrote:
         | > Some projects try to package this into a single framework,
         | but this approach doesn't always work either, because it
         | necessarily introduces new generic mechanisms and complexity
         | 
         | If the author doesn't want to have to learn "new generic
         | mechanisms and complexity", then they'll certainly hate any
         | huge breakthroughs in programming, because of course such a
         | thing will come with lots of new generic mechanisms and
         | complexity.
         | 
         | The reason single frameworks always fail is because they are
         | _single_. The combination of technologies and abstractions is
         | as important (or moreso) than the individual technologies
         | themselves, and those are decisions you need to be able to make
         | and change independently. Use small libraries that are focused
         | on doing one thing well, are mildly interesting, and can be
         | tweaked or swapped out without impacting everything else in
         | your code. Don 't use "single frameworks".
         | 
         | > A good hint is the recent GitHub Copilot development.
         | 
         | Absolutely not! This is entirely the wrong direction! You still
         | have bloated code that you need to test and maintain, but
         | instead of it being your code, it's the code of some
         | (literally) brainless intern who has an _unbounded_ potential
         | for stupid errors?
         | 
         | All "scaffolded code" is doing what the compiler (or some
         | abstraction) should be doing. Writing code the first time is
         | the _easiest part_. Why do you want help with the easiest part,
         | at the cost of making the hard part harder?
         | 
         | > And yet, most of programmer's time is spent reading or
         | planning how to change the code.
         | 
         | Is the author really just another person who thinks that
         | programmer productivity is based on the number of times they
         | hit their keyboard? This is so off the wall that it threw me
         | for a loop. You just complained about writing too much
         | boilerplate, and you want people to think less and type more?
         | This is insanity! The two most productive activities, by far, a
         | software developer can do are:                 - Discuss the
         | problem space with other programmers and experts with a
         | whiteboard nearby       - Stare out the window with the problem
         | on your mind
         | 
         | The author wants us to do _less_ of this!?
        
         | feoren wrote:
         | > The question is - if most of the work we want to do is about
         | changing existing code, then why is the system not optimized
         | for change by default? The code we write is optimized for
         | reading the source text and its storage.
         | 
         | But it _is_ optimized for change! That 's exactly the reason
         | line-by-line textual coding has been so hard to disrupt! Many,
         | many non-text or augmented-text options for code have been
         | tried, and they all fail exactly because they're _not_
         | optimized for change! It 's a pain in the ass to go and change
         | some visual, graph-based program that someone else wrote, and
         | an even bigger pain to keep it in source control. Text is the
         | easiest thing in the world to change.
         | 
         | And I'll repeat the same refrain whenever the idea of non-text-
         | based programming comes up: you're underestimating how long
         | code spends in a non-functional state (cannot be unambiguously
         | parsed into an AST), and how important that intermediate state
         | is. Text handles that state beautifully, and _every other
         | option_ fails at it hard.
         | 
         | > Or even better, I want to specify a goal like "I want this
         | function to not take this parameter" and let the system figure
         | out how to transform the program to achieve this goal.
         | 
         | Or, even better, I want to specify a goal like "Make me a
         | website that does cool shit" and let the system figure out how
         | to achieve this goal. The author's stated goal is extremely
         | ambiguous, and it's exactly our jobs to resolve that type of
         | ambiguity. What _exactly_ should the system to do? If you want
         | someone else to figure that out for you, then you just don 't
         | really want to be a programmer.
         | 
         | >I can imagine a system that can combine small transforms into
         | larger ones and use some AI magic to figure out how to compose
         | them to achieve the specified goal.
         | 
         | So this whole article really is just "I'm sick of programming
         | and I want an AI to do it for me". It's OK to be sick of your
         | profession, but that doesn't mean other people are doing it
         | wrong.
         | 
         | > If we instead focused on building the right model, we could
         | better optimize that model for editing and the text could be
         | just a view of that model. If the text is just a view, it
         | doesn't matter how it's written. Let everybody customize it the
         | way they want. I don't care if you put opening brace on a new
         | line, I don't even want to care.
         | 
         | But we _do_ just focus on building the right model. The text is
         | not the hard part -- not by a long shot! That 's why discussion
         | and deep thought are where the real programming happens;
         | translating it into working code is a very small fraction of
         | the whole process. "The text is just a view" just kicks the can
         | down the road -- a view into _what_? Whatever that underlying
         | thing is (some awful clunky graph-based model?), _that 's_ now
         | your language. Of course you have a language somewhere.
         | 
         | Again I get the impression the author is just sick of being a
         | programmer.
        
         | feoren wrote:
         | > Software testing doesn't work
         | 
         | Got it right there!
         | 
         | > We have some promising ideas. Some examples include strong
         | type system, fuzzing, snapshot tests and sanitizers.
         | 
         | Okay, look. There's a lot of different times when a software
         | error can be detected and fixed -- a whole spectrum. Let's be
         | real generous about the categories of things "software error"
         | can include here, including inefficiencies or building
         | something the user doesn't actually want. The lower on this
         | list we find errors, the more costly it is to fix them. Our
         | goal is to push up where we detect errors as high as possible
         | in the spectrum. It looks something like this (details and
         | order may vary):                 - Initial ideation  ["Facebook
         | for dogs? That idea sucks."]       - Requirements analysis
         | ["That's not actually how we calculate that metric."]       -
         | Conceptual system design  ["Wait, these parts don't fit
         | together like that."]       - Low-level design ["Crap, a loop
         | won't work here, I need a different flow."]       - Brain-to-
         | fingers typing  ["Whoops I almost typed 'elesif'"]       -
         | Immediately post-typing  [Red squiggly line under 'elesif']
         | - Re-reading  ["Wait that should be i-1, not i"]       -
         | Compile time  ["SYNTAX ERROR: Unknown identifier 'elesif'"]
         | - Unit test time  ["Assertion failed: expected 7, got 8"]
         | - Code review time  ["You didn't handle the case where N is
         | negative"]       - Merge / integration test time  ["Oh crap,
         | David's commit broke my commit! How the hell do I merge this?"]
         | - Internal manual testing time  ["You need to tighten up the
         | graphics on level 3"]       - Production  ["The users say the
         | application keeps crashing when they run this report! Fix it!"]
         | - Years later/never  ["Turns out the last 10 years of analysis
         | that we used to make business decisions were wrong."]
         | 
         | Testing is actually quite low on the list, and there are lots
         | of ways to move more errors higher up that list, such as strong
         | typing, good abstractions, and really clean code. It's also
         | tightly coupled to the implementation itself, so a conceptual
         | error in the code can also exist in the test's assertions. I'd
         | much rather write test that is obviously correct (errors caught
         | at re-read or compile time) than write tests; only when you
         | can't do you fall back to that lower-level option.
        
         | feoren wrote:
         | Look, of course there's lots of unexplored territory in
         | software engineering, and we absolutely should continue to
         | strive for better programming languages and abstractions. And
         | we are! From reading this article, this author is looking in
         | entirely the wrong direction for such improvements. It's not
         | going to be some magic visual model that
         | 
         | One thing we should _not_ expect is that new developments will
         | be easy for us to learn, because we are already steeped in the
         | current way of doing things. Supposedly, lexical scoping (what
         | we 're all familiar with) was extremely difficult to understand
         | by early waves of programmers that were used to dynamic scoping
         | (an insane way of doing it). They could have easily complained
         | that this was just some new over-complicated abstraction and
         | language construction that we don't need, but once you get over
         | that hurdle and understand it, life actually becomes much
         | simpler. New breakthroughs will hopefully be simple, but
         | probably not very easy for us [1].
         | 
         | Many of this author's complaints about the current state of
         | programming sound like they just haven't really achieved
         | fluency in their programming language yet, and that they've
         | been burned out on bad abstractions and have stopped trying to
         | create (or just can't recognize) good ones. That's OK, this is
         | all really hard to do! But it doesn't mean that everyone else
         | is doing it wrong.
         | 
         | [1] https://www.infoq.com/presentations/Simple-Made-Easy/
        
       | mike_hearn wrote:
       | Here's a few thoughts on how to make strides towards what this
       | guy wants, but with tools and features that largely exist today.
       | 
       |  _RE: Boilerplate_
       | 
       | A significant amount of the boilerplate he talks about comes from
       | the web stack not being designed for what we use it for. That
       | leads to a need for a complex three tier architecture, ad-hoc
       | app-specific protocols layered on top of HTTP, and then lots of
       | ad-hoc logic to convert that protocol to and from the underlying
       | database protocols.
       | 
       | Consider how much less code you'd have in a two tier architecture
       | that looks like this:
       | 
       | 1. An app that runs on the user's machine, which connects
       | directly to:
       | 
       | 2. Your RDBMS, which knows about every user of your app and
       | imposes security/privacy ACLs on them in the standard manner
       | using views/row based security/etc.
       | 
       | In this architecture there is no web server, no REST, no JSON, no
       | JWTs, and therefore also entire classes of security bugs are
       | eliminated in one go (XSS, XSRF, SQL injection, non-
       | transactionality triggered race conditions etc). There are also
       | no load balancers because your DB driver already knows how to do
       | client side load balancing, and a variety of other advantages.
       | When you need more than just standard SQL CRUD operations you
       | write server side function plugins for your RDBMS in a language
       | of your choice and let the DB protocol and servers act as an RPC
       | protocol that happens to support batching, transactions, large
       | result streaming/paging all built in. In effect the RDBMS itself
       | becomes the application server.
       | 
       | Today we don't build apps like this for a few different reasons,
       | mostly related to the inconvenience of distributing desktop
       | software outside a web browser. But that's solvable! And in fact
       | my current project is a company that makes a tool that makes
       | distributing desktop apps as easy as distributing web apps is
       | [1]. With that and a technology like Kotlin Multiplatform +
       | Jetpack Compose, or with JavaFX, you can write a single frontend
       | app that runs on every desktop OS, Android and iOS (where you can
       | write a custom SwiftUI GUI with shared business logic or re-use
       | the Android UI code if you don't need pixel perfect native UI.
       | 
       | There are a few other issues that are all also solvable e.g.
       | tunneling DB protocols through proxies, OAuth/SSO integration,
       | streaming code to the client etc. And as a pattern it really
       | benefits from a powerful RDBMS. But once you have the foundation
       | of brain-dead simple app packaging+signing+notarization from your
       | laptop, with smooth auto update to clients, suddenly you have
       | lots of options to massively simplify up and down the stack.
       | 
       |  _RE: Text vs abstract code models._
       | 
       | Another big win if you go this route is you suddenly have way
       | more language freedom. The author talks about wanting a database
       | to store his code, but then talks about Rust, for which IDE
       | support is limited. If you use a language with really good IDE
       | support like Kotlin or Java, then your IDE is building a database
       | like the one he wants already. He says it's painful to query that
       | DB but that really depends a lot on what you know and what
       | languages you use. IntelliJ has a structural search+replace
       | feature that lets you do example based queries, and it also has a
       | console and plugins that let you do on the fly queries and
       | structural changes by writing code against their PSI API. You
       | don't have to write full blown plugins [2].
       | 
       | [1] https://www.hydraulic.software
       | 
       | [2] https://plugins.jetbrains.com/plugin/7282-liveplugin
        
       | fillest wrote:
       | I think, the problem is: the production of languages (and
       | libraries especially) is way too much market-driven, there is too
       | little cooperation, too little time spent to polish and to model
       | at least some major use cases. Also the quality of education is
       | too poor, too focused on time-to-market - it makes harder for
       | non-seniors to understand e.g. complex type systems (which are
       | required for more usable languages anyway).
       | 
       | A language is released too prematurely -> some companies start to
       | use it -> design problems become clear, but the language is in a
       | compatibility trap at this stage -> e.g. it becomes a swamp or it
       | slowly becomes a monstrosity of design afterthoughts and
       | crutches.
       | 
       | It probably even wouldn't require much more spending from
       | corporations, only some initiative. They anyway already invest
       | considerably in language&toolchain development, but often with
       | wasteful goals.
        
       | eternityforest wrote:
       | Glue code is used to piece together libraries. I think it's a
       | sign you used the right libraries and aren't reinventing. It's
       | boring, but glue code essentially describes why your project is
       | not the same as every other apo using those libraries.
       | 
       | Boilerplate is a thing that happens when libraries don't have
       | sane defaults. It's one of the more unpleasant things about
       | Docker et al. I wish we had a dev climate where something like
       | Linux Standard Base could take off.
       | 
       | I find frameworks to be perfectly fine, as long as you break out
       | of the "Perfectly fit the code to the vision in my head" model
       | and go for "How do I make this product using only these high
       | level blocks I have, without modifying them".
       | 
       | Frameworks are great as long as you don't fight them. Using a
       | distro like Mint? Don't try to swap out core system services.
       | Using a declarative web framework? Don't try to do some
       | synchronous imperative stuff it was never meant to handle.
       | 
       | I get the feeling a lot of programmers really value creative
       | freedom and don't want to feel like they are playing a rail
       | shooter, just coding the one obvious thing the opinionated tools
       | tell them to do, and then they have a bad time when they use
       | tools that were specifically designed to remove any need for
       | interesting code.
        
         | mst wrote:
         | What do you have in mind when you talk about LSB for Docker?
        
       | galaxyLogic wrote:
       | I've often thought about similar idea(s), the program is
       | constructed out of nested components, almost like LEGOs. When we
       | play with LEGOs we don't need a "programming language". Or do we?
       | 
       | But what is a "language"? It is a set of "legos" of different
       | types like 'verbs', 'nouns', 'adjectives' which can be combined
       | in many different ways, but only according to the lego-rules of
       | syntax. Some lego-pieces can not be combined together.
       | 
       | The ways LEGOs can be combined is a "syntax definition" the
       | designers at the LEGO headquarters came up with. LEGOS are a
       | language.
       | 
       | So I don't think it is possible to program computers without a
       | programming language. Even configuration needs some kind of
       | language to give you the flexibility you need.
        
         | sleepybrett wrote:
         | Lego created a visual programming language for their mindstorms
         | system that is exactly this. It's very similar to scratch and
         | while it lets you get things done and you can build some pretty
         | amazing things with tools like that. The ... second order
         | tooling... just isn't there. We have a huge amount of tools
         | running around that can deal with code as text, but there are
         | no analogous tools for these visual programming environments.
         | 
         | I've dug into some of these tools in the past, wrote some
         | projects using things in the 'creative coding' space like
         | quartz composer, touch designer, vvv ... at a certain point the
         | visual clutter gets you and, at least in my experience, it was
         | just faster to rewrite in a creative coding framework like
         | openframeworks/c++.
        
       | preseinger wrote:
       | > Program is not a text, [it is] a model
       | 
       | I don't think so. In fact, I think this perspective is actively
       | harmful.
       | 
       | A program is whatever the human beings who maintain that program
       | operate against. I mean there are many possible representations
       | of a program, and there are different ways to evaluate those
       | models, but the model that most precisely expresses the AST of
       | the logic of the program, or the call sequence of the von Neumann
       | execution of the program, or whatever else? These models are
       | incidental. The thing that matters is whatever humans read and
       | interpret and mentally model. And for the moment that's source
       | code.
        
         | cultofmetatron wrote:
         | to add to that, this programming is a model is how we got
         | smalltalk. a collection of interesting ideas from which its
         | peripheral ideas got pillaged into other languages while
         | leaving the core idea to just smalltalk.
        
         | hzhou321 wrote:
         | Yes, I agree! In fact, the break through we needed is to view
         | programming as a human cognitive operation and embrace the
         | text, and treat manipulating text as a main component of
         | coding. For example, I want to code                    foreach
         | item in list_A              do_something(item)
         | 
         | This text is the native code in the programmer's mind, and we
         | should allow programmer to just do so. Then, in a second layer,
         | the programmer should code up the transformer and translate
         | that to the actual programming language, adding incidental
         | complexity such as specific syntax and internal language
         | representations, so that the lower level compiler can verify
         | and consume and feedback.
         | 
         | The transformer part is super hard if we rely on automatic
         | tools, which is just another version of a compiler. It is super
         | tedious if we rely on human manual work, which is just how
         | today programmers do. But if we view the transformer part as
         | part of programming, where programmer employs tools to mold
         | their program, then it makes sense. The programmer will be able
         | to program the tools to avoid the tedious part but still with
         | full flexibility to mold anyway they desire. It is still
         | programming, but in a meta frame where text is the target.
        
           | hzhou321 wrote:
           | For those who are interested, checkout MyDef -
           | https://github.com/hzhou/MyDef
        
           | preseinger wrote:
           | Agreed. Programs are not equations, they're recipes.
        
         | david927 wrote:
         | I couldn't disagree more.
         | 
         | You don't buy a drill, you buy a way to get a hole in, say,
         | wood. That's the core product.
         | 
         | The core product of 'programming' is a software solution. So
         | far, the best way to approach it is text.
         | 
         | But... text is an incredibly poor model! It's almost literally
         | an accounting system of "Jake spent fifty dollars." It's text
         | which is "actively harmful," and we see it all around us in the
         | absence of maintainable systems. Yes, currently, it's the best
         | way we've found; just as horse and buggy was the best current
         | form of travel 150 years ago. But it takes very little
         | imagination to expect we'll find better.
        
           | preseinger wrote:
           | Programs are ideas that need to be understood, modeled, and
           | manipulated by humans. Text is the best available way to
           | incept ideas into the minds of humans.
        
             | david927 wrote:
             | _> Text is the best available way_
             | 
             | I said exactly that. I added that it's horrific and it's
             | not hard to imagine that we will find a better way.
        
             | glass_of_water wrote:
             | If that were true, text books wouldn't contain any
             | diagrams. So I think it's fairly uncontroversial to say
             | that there are cases when text is not the best way to
             | incept ideas. So why should we be confined to just text
             | when writing code? Should we not be free to choose the best
             | tool for the job?
        
         | unixbane wrote:
         | Programming is an exercise in manipulating semantic objects
         | which is why stuff like blueprints in unreal engine are so easy
         | to use. It will just get better and text will become an
         | obsolete vestige, regardless of whatever idea you have of this
         | being "harmful". I really don't think a character encoding with
         | 30 ways to control the terminal (and now extended to encode
         | emojis) is the be all end all way of writing and editing
         | programs.
         | 
         | Consider that if text had an advantage, it would be that you
         | could cut some string in half as some sort of manipulation that
         | saves time. What do I cut in half? Change >= to = ? There's
         | basically no advantage of text. I don't want half of an if
         | statement, that's what text allows me to do, it's a pointless
         | feature that makes inputting programs harder. The basic element
         | on the screen should be the if statement itself.
         | 
         | There is no advantage to a 1D language. Text is a 1D language.
         | If you have                 if (x) {         if (y) {         }
         | }
         | 
         | You are just reading it as a 2D language, but it's not. It
         | could be                 if (x) {         if (y) {         }}
         | }
         | 
         | and mean something else. (Yes I'm sure you can catch this one,
         | but not all in general). The only way to be sure is read it
         | from start until end, which nobody does. This is a security
         | issue too, which I discovered when I was 12 years old reading
         | perl scripts from milworm. By formatting text you are already
         | conceding that 2D is better.
        
           | thrown_22 wrote:
           | So what happens when you have a 10 deep nested if tree?
           | 
           | Your answer would be to not do it because it doesn't fit
           | nicely in a 2d page. My answer would be to put it in a 1d
           | line and not bake semantics into presentation.
           | 
           | But you can't pretend that the space of programs isn't
           | infinite dimensional when the space we work in is only 3d.
           | Regardless of how clever you are using a medium with a
           | dimensionality higher than 1 for semantics will always result
           | in expressions you can't express.
           | 
           | This is why we've stuck with text.
           | 
           | It's 1d, but we can make it 2d to help understand what is
           | going on visually in the simple cases humans can understand
           | intuitively. Yet it is complex enough to represent any
           | possible object.
        
           | preseinger wrote:
           | Semantic objects are non-dimensional. In fact they are
           | probably best understood as simply ideas. Humans have been
           | effectively incepting ideas in each other since the birth of
           | language and writing. Text is, demonstrably, the best way to
           | convey semantic ideas among human beings.
        
         | dleslie wrote:
         | Indeed, in a way the author is saying that the meaning is
         | independent of the text; which, in literary circles, was once
         | hotly debated. I land on the textual side of the line; the
         | medium is as important to the meaning as the abstract concepts
         | that might be components of it. Multiple tellings of the same
         | story carry different meaning, sometimes subtly, when they are
         | each one of oral, text, photo, painting, or film.
         | 
         | I believe the same is true of programming. A solution in C is
         | fundamentally distinct from a solution in ladder logic, or
         | Haskell; even if they solve the same problem.
        
         | ablob wrote:
         | How is it harmful?
         | 
         | > A program is whatever the human beings who maintain that
         | program operate against
         | 
         | This does neither invalidate the statement that "Program is not
         | a text", nor that "[it is] a model".
         | 
         | > And for the moment that's source code.
         | 
         | How is wanting to change that harmful? Source code can have
         | flaws like ambiguity (see C++'s need for typename). Deeming a
         | call for improvement on the existing representation of a
         | program harmful is a fine way to stop any progress at all. We
         | would still be putting in raw numbers into memory with that
         | attitude.
         | 
         | On another note: I think what matters is what the computer
         | actually does. Whatever I, as a human, read and interpret has
         | no meaning at all if the computer decides to "read and
         | interpret" it differently. And the only limit with representing
         | what the computer actually does should be your imagination.
        
           | preseinger wrote:
           | > I think what matters is what the computer actually does.
           | Whatever I, as a human, read and interpret has no meaning at
           | all if the computer decides to "read and interpret" it
           | differently. And the only limit with representing what the
           | computer actually does should be your imagination.
           | 
           | Well, I understand this perspective, but I judge it to be
           | backwards. The computer should be understood as secondary to
           | the human. Mechanical sympathy is necessary for useful
           | software but the goal of software must not be mechanical.
        
       | Jeff_Brown wrote:
       | Does testing really suck, or is the problem that specifying and
       | being even moderately sure your program actually does, what it's
       | supposed to is hard?
        
       | remram wrote:
       | I don't see the problem with boilerplate or editing code. Even
       | using a template with your CI/CRUD boilerplate/deploy scripts/...
       | is no problem if you have version control, you can easily see
       | what comes from the template, what you've changed, and reconcile
       | with a new version of the template.
       | 
       | What is the problem? That not 100% of the code in the file is
       | business logic or only exists in that project?
       | 
       | When I receive a letter, there is plenty of boilerplate there:
       | addresses, greetings, sign offs, business hours... does that
       | really get in the way of my reading the message, once I'm used to
       | the format? The information is there if I need it, easy to ignore
       | if I don't, and easy to copy-paste for the author who will update
       | if needed (e.g. closed exceptionally or something).
       | 
       | Is the author running into a problem or just complaining about
       | perceived inefficiencies that don't actually get in anyone's way?
        
       | yaccz wrote:
       | > the text is just a tool to manipulate some abstract model of
       | the program.
       | 
       | yup.
       | 
       | > When you think about it this way, it becomes clear that using a
       | textual source code is really inefficient way to manipulate this
       | model.
       | 
       | Hard nope. All the attempts at different approach were a failure
       | so far. Text so far is the best thing we have because text can be
       | analyzed formally and computed with by computers. This is the
       | result of the work that's being going for at least like 200 years
       | in philosophy, logic, and math.
       | 
       | What we really need is to bridge the gap between programming and
       | math as industry standard, not academical exersise somehow. But I
       | highly doubt eliminating text as source code is it.
        
         | panstromek wrote:
         | To be clear, I don't think we should get rid of text
         | completely, or use some drag&drop UI or some visual model. It's
         | just the program should be defined by the semantic model first
         | and then viewed/edited however it is practical (often by text
         | again).
         | 
         | And we already do this in many places - many common code
         | changes we do are already automated by IDE (which maintains the
         | model in memory), so we don't edit the text directly and we
         | don't even think about it that way, we think about how we want
         | to transform the model (ie. extract a function), not about how
         | the text moves between files.
         | 
         | > Text so far is the best thing we have because text can be
         | analyzed formally and computed with by computers.
         | 
         | This doesn't make too much sense to me. Using the approach I
         | talk about would actually make that much easier, because tools
         | wouldn't need to parse the text and work directly on the
         | semantic representation (i.e. it's much easier to query a
         | database than extract the information from textual sources)
        
         | touisteur wrote:
         | To add to this, I think text still needs to be the canonical
         | representation of programs. But we're still ways away with
         | tools to express ways we want to modify, generate code. I think
         | the late Pieter Hintjens had the right of it: we should
         | generate code more often (I know it's polemic here). Not behind
         | some magic curtains like the overly complex (for me) and
         | difficult-to-inspect c++ templates but actual code generators.
         | 
         | One example: recordflux [0] generates, from a high-level dsl,
         | SPARK code that can be proved to be Absent of Run-Time Error.
         | It has a model checker for high-level constraints but lays out
         | serialisation/deserialisation code to access fields. They've
         | been recently working protocol/session-level modeling and it's
         | getting very interesting.
         | 
         | I have a similar tool that I use to generate AORTE serdes code,
         | but once you have that, you can go on to generate fuzzers,
         | proxies to other techs.
         | 
         | We're probably also missing a way to target interesting
         | intermediate representations of programs (either Why3 VCs, cbmc
         | GOTO, but maybe also to lean 4 or whatever temporal logic tool
         | of the day, or other automated/assisted proof or generation
         | environments).
         | 
         | Writing those is a huge undertaking every time, and a lot of
         | duplicated potentially buggy effort. I look at the amazing work
         | that's been done (and still being done) to bring up libadalang,
         | a parsing and high level semantic query tool that changed my
         | day-to-day coding paradigm. One of the missing pieces of the
         | puzzle is to me the 'generic parser and semantic specification'
         | that would generate an interpretor and all those proxies for
         | you.
         | 
         | [0] https://blog.adacore.com/recordflux-from-message-
         | specificati...
        
       | Taikonerd wrote:
       | _> Maybe you could write tests as queries that would test a whole
       | set of possible programs, not only the current version of your
       | program at the moment._
       | 
       | I think that the future of programming is more sophisticated
       | static analysis. Programmers will write statements like, "every
       | code path that writes to the Payments database must have called
       | validate_user()." Then, the tooling will confirm that rule with
       | every commit.
       | 
       | We kind of have this already (for example, Facebook's Infer tool
       | [0]), but I think it will become much more important in the
       | coming decade.
       | 
       | 0: https://github.com/facebook/infer
        
         | hcarvalhoalves wrote:
         | Watch this (skip to 1:17:28 to see a quick demo, the rest of
         | the video is the explanation):
         | 
         | https://youtu.be/OyfBQmvr2Hc
         | 
         | It's exploiting logic programming to query for a program that
         | satisfies some condition.
        
           | spikej wrote:
           | But take a step higher and you get this
           | https://youtu.be/FvNRlE4E9QQ
        
         | vsareto wrote:
         | To set up an example, Azure has some API management stuff that
         | could let you do this before you even got to your code. Writing
         | a tool to make sure that API management rule exists would be
         | different than static analysis.
         | 
         | I'd agree with you, but not all of the business logic like that
         | is going to live in code in the future.
        
       | the_other wrote:
       | I stopped reading at this point:
       | 
       | > We spend endless amounts of time bikeshedding the right syntax,
       | indentation level, tabs vs spaces, or where to put code in the
       | structure of files, but this all feels just pointless - these are
       | all properties of text, but the text is just a tool to manipulate
       | some abstract model of the program.
       | 
       | No we don't spend endless time doing this. We automate as much of
       | that as possible. I haven't cared about syntax for whitespace for
       | years (I mean, I care and I have opinions, but I almost never
       | have to work on it).
       | 
       | One item from the list, which we can't automate, is a really
       | important part of the job: "where to put code in the structure of
       | files". This is an intrinsic part of the solution modelling.
       | Often this is something you want to change as the project
       | expands. What are the modules and objects of your application?
       | What are their responsibilities? Does this new object now have
       | responsibility for that thing over there? These are key questions
       | to answer on a daily basis.
       | 
       | I agree with the complaints against boilerplate. Boilerplate can
       | help decide where a bit of code should live, but it also gets in
       | the way when changing that decision is the best thing to do. We
       | don't teach or celebrate refactoring enough (at least, not in the
       | places and projects I've worked).
       | 
       | Perhaps I should read more of the article...
        
       | alphanumeric0 wrote:
       | "Software testing doesn't work".. and "No matter how hard we try,
       | it just sucks." then the next sub-heading: "I want simpler
       | testing".
       | 
       | Okay, well, you just said it doesn't work, but you still want
       | (simpler) testing?
        
       | jaredcwhite wrote:
       | As a dyed-in-the-wool Rubyist, I consider Ruby the pinnacle of
       | high-level, abstracted, expressive programming for the contexts I
       | care about (small web applications largely written by solo devs).
       | 
       | What's sad to me is that the modern follow-up to Ruby seemingly
       | doesn't exist. Every hot "language du jour" which has come after
       | Ruby has gone BACKWARDS. Lower-level, more systems programming
       | oriented. Maybe even compiled. Static typing everywhere. It's
       | utterly baffling to me.
       | 
       | "Why are you using Ruby? You should use...Rust! (Go! Zig! Fill-
       | in-the-blank nerd hype!)"
       | 
       | Lol.
       | 
       | What I _actually_ want is a new programming language /environment
       | which makes _Ruby_ look like programming pointer arithmetic in C
       | by comparison. Something so advanced, so high level, that much of
       | the time you 're really just describing patterns and flows and
       | data models and extensions, and then letting the computer
       | determine the most efficient way to develop those code paths and
       | execute them.
       | 
       | Unfortunately, I'm a bit cynical on this front. I believe the
       | reason this doesn't exist is because it's at cross-purposes with
       | programmer nerd culture. Many programmers enjoy the nitty-gritty
       | of low-level coding. They fear abstraction. They fear "magic".
       | They fear things like "implicit imports" or "duck typing" or
       | "many ways to express the same method/function/algorithm" etc.
       | because it's all nebulous and fuzzy compared to the safe confines
       | of deterministic math & logic. "If I declare that this variable
       | MUST BE AN INTEGER, then it MUST BE AN INTEGER. The idea you
       | could pass me a string instead? UNACCEPTABLE !!!#%@!"
       | 
       | In other words, I don't have high hopes that great UX for
       | forward-looking developers will come from present-day programming
       | culture. For a quantum leap in DX, we probably need people who
       | _aren 't_ die-hard programmers to engage in blue sky thinking. We
       | need to talk to artists, philosophers, linguists, psychologists,
       | and other experts in social & historical cultural dynamics. They
       | can provide the insight we lack. Because for every "this is an
       | integer, damnit!" type out there, there are probably many, many
       | more who would see 123 and "123" and think THAT'S THE SAME THING.
       | :-D
        
         | commandlinefan wrote:
         | > the reason this doesn't exist is because it's at cross-
         | purposes with programmer nerd culture
         | 
         | If that was the reason programming is "hard", we wouldn't ever
         | have gotten COBOL, Basic, PHP, SalesForce, Windows, UML or any
         | drag-and-drop query tool.
        
         | galdosdi wrote:
         | Something like ruby is great for WRITING greenfield code. But
         | without static typing, diving into and maintaining an existing
         | codebase that you just got hired on to deal with becomes a lot
         | more stressful.
         | 
         | And that's why there's still plenty of legacy Java code, but
         | legacy ruby code over the last decade has been much quicker to
         | get thrown away and rewritten.
         | 
         | I once took over a Java codebase that was clearly created
         | entirely by people who barely knew Java and I was still able to
         | fully understand (and, in the process, refactor it to cut it in
         | half, because half of the code was dead code by the time I
         | encountered it, lol) in about a week. This was not a very large
         | codebase to be honest, but it would have been impractical
         | without static typing and a good IDE that leverages the same.
         | 
         | Dude, the reason programmers fear abstraction is because
         | they've had to maintain legacy codebases. It sounds like you've
         | been lucky enough to mostly be able to do greenfield stuff or
         | maintaining codebases that aren't very old. I am sure you would
         | understand their views more if you had more experience with
         | maintenance.
        
         | IshKebab wrote:
         | Yeah I think you'll realise how bad dynamic typing is when you
         | stop working on solo projects.
        
         | pramodbiligiri wrote:
         | Have you tried any of the Low-Code/No-Code tools of the recent
         | years? Do you feel they are a big leg up from Ruby when it
         | comes to small webapps done by solo developers?
        
           | jaredcwhite wrote:
           | I can't say that I have specifically tried any, but I feel
           | like if someone had come out with a new "the Rails for X"
           | where X is a programming language even more abstracted than
           | Ruby, I would have heard about it.
        
         | bjourne wrote:
         | I totally agree. When given the chance, (and if the goal is
         | productivity) I always use Python because it is the most high-
         | level and most productive language and ecosystem out there. I
         | learned it almost 20 years ago and it was apparent after only
         | spending a night or two with it that it was massively more
         | powerful than Java, C and C++ which were the languages I knew
         | at the time. Since then I have not discovered anything that was
         | a similar improvement as Python was over Java. Concatenative
         | programming comes close but suffers from small ecosystem and
         | there are issues with the syntax.
         | 
         | Automatic memory management became mainstream in the 90's and
         | dynamic typing in the 2000's. But what did the 2010's give us?
         | Github and Stackoverflow? I think we are due for another
         | "programmer productivity" revolution but I have no idea what it
         | will be. Statically typed programming languages that are
         | marginal improvements on existing dominant languages for sure
         | aren't it.
        
         | politician wrote:
         | Complaints about static typing boil down to not wanting to be
         | responsible for the schema and data architecture of the program
         | itself, and that desire to remove responsibility for designing
         | the scheme is where ORMs like ActiveRecord find a foothold.
         | 
         | Unfortunately for folks and languages with this mindset, if
         | they need to have good performance, eventually they will need
         | to take responsibility for the data model of their database and
         | their codebase.
         | 
         | Code is data, and types are schema.
        
         | openfuture wrote:
         | Obligatory "elixir+phoenix is supposed to inherit ruby on
         | rails" remark
        
         | j_crick wrote:
         | > patterns and flows and data models and extensions
         | 
         | Might I suggest that you could probably try some Clojure and
         | see how it goes.
        
           | jaredcwhite wrote:
           | I'm sure Clojure is very exciting for Clojure fans...but
           | afraid it's utterly inscrutable and unreadable to me.
        
         | samiskin wrote:
         | This all makes sense given "for the contexts I care about
         | (small web applications largely written by solo devs)".
         | Unfortunately for you most software (and therefore what most
         | developers work with) isn't for those contexts, but rather for
         | larger projects written by multiple devs, where being lower
         | level and compiled (runtime speed) and having static typing
         | (more explicit and easily understood by other devs) become much
         | more valued.
         | 
         | You'll probably always be in the minority with your preferences
         | because of this.
        
           | jaredcwhite wrote:
           | I love being in the minority with my preferences...have for
           | most of my life.
        
         | davewritescode wrote:
         | I love Ruby, I'm not a dyed in the wool Rubyist but I've been
         | involved with some fairly large projects that were written in
         | Ruby and in my experience writing Ruby code can feel somewhat
         | magical and empowering because of how fast you can get ideas
         | down. As much as I love Ruby the meta-programming and the type
         | system can make refactoring a complete nightmare and as
         | projects grow larger they tend to become a really big mess.
        
         | LionTamer wrote:
         | Do you think that perhaps functional programming can be a happy
         | compromise between high level abstractions / declarative code
         | style and strong math / logic foundations? My programming
         | experience is largely in Python and Java and so I can relate to
         | both sides you present - I feel constrained by the aggressive
         | static typing of Java but also feel that Python can be a bit
         | too fast and loose with typing and I often find that dealing
         | with unexpected behaviors takes as much time as it would to
         | just have them written formerly and properly into the code to
         | begin with through a strong type system.
        
         | eximius wrote:
         | > for the contexts I care about (small web applications largely
         | written by solo devs).
         | 
         | found your source of disagreement. this is, generally, not the
         | domain anyone writing languages cares about. no one writes a
         | language for an individual.
        
           | 082349872349872 wrote:
           | Dennis Ritchie wrote C for himself.
        
         | correlator wrote:
         | Ruby was also the first thought in my mind reading this
         | article.
        
         | pharmakom wrote:
         | Have you tried Clojure?
        
         | insane_dreamer wrote:
         | unfortunately I don't use it at work but Ruby is still by
         | favorite language, by far; it suffers from a lack of solid
         | math/sci libraries like Python has
        
         | zasdffaa wrote:
         | > What I actually want is a ... and then letting the computer
         | determine the most efficient way to develop those code paths
         | and execute them
         | 
         | Give us something _actionable_ and not handwavy dreaming and
         | you might get it.
        
         | WJW wrote:
         | The main problem with more and more abstract forms of
         | describing "what you want" instead of "what the computer should
         | do" is that the program still needs to run on a computer, and
         | those are inherently non-abstract. There is no duck typing on
         | the CPU level and figuring out what exactly you passed as an
         | argument takes up a lot of time.
         | 
         | Don't get me wrong, I love me some Ruby and it makes up the
         | majority of my income. But it would be foolish to ignore that
         | it is indeed 100x slower (or more sometimes!) than some of the
         | modern compiled languages. Small to medium web applications are
         | exactly the sweet spot for Ruby because network latency hides a
         | lot of the language slowness. Nobody cares about 20 extra
         | milliseconds for a request to a server 100 ms away, but a lot
         | of people care about 20 milliseconds delay in frame rendering.
         | 
         | EDIT: The following:
         | 
         | > What I actually want is a new programming
         | language/environment which makes Ruby look like programming
         | pointer arithmetic in C by comparison. Something so advanced,
         | so high level, that much of the time you're really just
         | describing patterns and flows and data models and extensions,
         | and then letting the computer determine the most efficient way
         | to develop those code paths and execute them.
         | 
         | sounds exactly how I feel when programming in Haskell, although
         | that particular language will probably not sit well with you if
         | you absolutely want duck typing.
        
           | commandlinefan wrote:
           | > describing "what you want" instead of "what the computer
           | should do"
           | 
           | Actually, static typing _is_ describing  "what you want" and
           | leaving it up the compiler to make sure you were consistent.
        
         | ransom1538 wrote:
         | Agreed. Worse for me was starting with VB6 as a kid. A nice
         | IDE, amazing debugging, easy visual components. Entering the
         | professional field using php seemed like a strange nightmare.
         | It was like taking a time machine into the past.
        
         | shpongled wrote:
         | I personally find strong static typing (a la Rust, Haskell,
         | Standard ML) to be much more expressive and with better UX/DX
         | by miles.
        
         | mcdonje wrote:
         | Sounds like you want more declarative languages, like SQL. The
         | magic to get those to work well is a lot easier to implement
         | and optimize if the problem space is restricted. So, DSLs.
        
         | throaway2323221 wrote:
         | Ex-RoR dev here. I'm not seeing any evidence of Ruby being
         | valuable outside of rails. If I wanted magic I can just use a
         | lisp such as clojure.
        
         | BlargMcLarg wrote:
         | Pretty sure I speak for a majority of experienced devs when I
         | say: we don't fear abstractions. We fear abstractions made by
         | others, including our former selves, in the all to often
         | occurring context of "business wants it done by yesterday and
         | we have zero idea what the requirements actually are". All the
         | while we're still figuring things out and having 30 minute
         | discussions on the most miniscule things.
        
           | commandlinefan wrote:
           | I think you're all being too charitable to OP: "Programming
           | would be easy if it weren't for stuck-up snobby programmers
           | gatekeeping it" is up there with "math would be easy if it
           | didn't have all this notation stuff" or "music would be
           | simple if they didn't insist on writing it on those staves
           | with those circles".
        
             | amadeuspagel wrote:
             | > "music would be simple if they didn't insist on writing
             | it on those staves with those circles"
             | 
             | Yeah. Staves with circles are something optimized for pens,
             | and almost every modern music software uses simpler
             | notation. Does that make music simple? Not quite, but it
             | certainly makes it more accessible.
        
           | Tao3300 wrote:
           | > we don't fear abstractions. We fear abstractions made by
           | others, including our former selves
           | 
           | that's all the abstractions :-\
        
         | heurisko wrote:
         | > Static typing everywhere.
         | 
         | I think the industry has generally recognised that static
         | typing makes more reliable software.
         | 
         | I started with PHP and have seen its type system evolve.
         | Similarly Typescript. I since moved to other staticly typed
         | languages. I wouldn't want to go back.
        
           | jaredcwhite wrote:
           | Depends on the context. When you're programming a
           | transactional banking system? Heck yeah I want static types.
           | 
           | When you're programming a form on a web page? It's way-ay-ay
           | more effort for dubious gains, with new downsides added into
           | the mix.
        
             | tasuki wrote:
             | > way-ay-ay more effort for dubious gains
             | 
             | How is it way more effort? In any of the nicer languages,
             | there's type inference.
             | 
             | Dubious gains? Strong static typing makes entire classes of
             | runtime bugs impossible (null pointer exceptions, for
             | example).
        
             | wizofaus wrote:
             | New downsides such as? And if having to add a few type
             | definitions to your codebase is "way-ay-ay" more effort, I
             | can only assume you really hate typing, as the mental
             | effort is typically very low (compared to figuring out how
             | to efficiently translate business logic into code, and how
             | to organize code to make it easy for a team to work with
             | over many years as requirements change etc.). There even
             | tools that will generate type definitions for you based on
             | sample data.
        
             | heurisko wrote:
             | > When you're programming a form on a web page? It's way-
             | ay-ay more effort for dubious gains, with new downsides
             | added into the mix.
             | 
             | If you don't mean just HTML but some server side
             | processing, yes, I would. This is still PHP's bread and
             | butter and being able to bind a form to static types is
             | really convenient.
        
             | mst wrote:
             | This is a wild-ass guess but ... I don't use IDEs.
             | 
             | In fact I use original Bill Joy vi.
             | 
             | I suspect for most of the people we're talking to 'I<tab>'
             | will say Int and 'S<tab>' will sat String and that's going
             | to make our experiences very different.
        
             | wvenable wrote:
             | > It's way-ay-ay more effort
             | 
             | No, it's not. Initially it's not any more effort and in the
             | long term it's significantly less effort. Having spent
             | equal amounts of decades in static and dynamic typing (and
             | strong/weak) I would absolutely take the former any day for
             | both ease of development and correctness.
        
               | preordained wrote:
               | > Having spent equal amounts of decades in static and
               | dynamic typing
               | 
               | I hear this, as well as "eliminates whole classes of run
               | time errors" (as if Ruby and other such codebases are
               | just ablaze everywhere on account of this...), but I
               | wonder if people dabbled in this and think they have it
               | all figured out, or if they've used a modern dynamic
               | language like Clojure that has default immutability or
               | been in a modern Ruby codebase that wasn't cowboy-coded.
        
               | wvenable wrote:
               | Some of this is just personal taste -- programmers are
               | not all cookie-cutter intellectuals that approach all
               | problems the same way. We're also not all working on the
               | same problems.
               | 
               | For me, the idea of dynamically modifying code at runtime
               | is like the first circle of hell. But I've programmed in
               | enough languages to understand the appeal even if it
               | doesn't fit with the way I like to work.
               | 
               | But I will take issue with blanket statements that static
               | typing is more effort than dynamic typing with all things
               | being equal. In my own personal experience, that is just
               | not the case. But I wonder if many people have been so
               | damaged by Java that anything seems better by comparison.
        
               | preseinger wrote:
               | > as if Ruby and other such codebases are just ablaze
               | everywhere on account of this..
               | 
               | They literally are, I think? Ruby is a notoriously
               | unreliable language, in large part due to its dynamic
               | type system... (also all of the unsafe idioms it
               | promotes, a separate discussion)
        
             | choeger wrote:
             | > It's way-ay-ay more effort
             | 
             | Just because you tend to ignore the many complexities that
             | are actually involved in a form on a web page. It's exactly
             | this bias that stems from untyped languages and that needs
             | to die. Http is a complex beast and we should either
             | replace it with something more simple and robust or at
             | least acknowledge the complexity in our programming.
             | 
             | Generally speaking, if doing something with a proof of
             | type-safety feels complex, you probably ignored many corner
             | cases before.
        
               | [deleted]
        
               | bcrosby95 wrote:
               | It's not complexity. It's pointless bookkeeping.
               | 
               | If you don't cut corners on your static typing, you're
               | looking at 2-4 _single use_ classes per API endpoint: 1-2
               | for the web layer, and 1-2 when going into the domain
               | logic layer.
               | 
               | Many people skimp and just re-use the core domain class
               | for everything, which is the worst of both worlds.
               | 
               | I'll take a map, spec, and select-keys over this all day
               | long.
        
               | jhomedall wrote:
               | Why would static types require you to create additional
               | classes?
        
               | preseinger wrote:
               | Your tools leave you open to type errors, which you have
               | to de-risk via unit tests. That risk is automatically
               | eliminated by static type systems. Dynamic typing is a
               | reasonable choice for single-developer and/or toy
               | programs but isn't inappropriate for projects maintained
               | by teams over time.
        
               | xigoi wrote:
               | Statically typed [?] class-oriented
        
               | wizofaus wrote:
               | 2-4 single use type definitions per endpoint sounds
               | pretty atypical to me, but I agree choice of language
               | helps here, e.g. TypeScript has pretty powerful typing
               | facilities (Pick/Partial etc) that make type reuse far
               | more practical. It's bookkeeping yes, but definitely not
               | pointless.
        
               | [deleted]
        
               | bcrosby95 wrote:
               | 1 for the endpoint's web request, and 1 for its web
               | response. Domain types also usually need custom web tier
               | types because usually they have data you don't want
               | strewn across the web. And even if they don't now, they
               | might in the future - I don't want us to accidentally
               | leak information we shouldn't because we were lazy.
               | 
               | This may be atypical, but if you're using a statically
               | typed language, it, IMHO, shouldn't be. Types tend to be
               | the best way to guarantee this stuff in a statically
               | typed language, and if you aren't guaranteeing it you're
               | coding with your pants around your ankles.
               | 
               | The flexibility of TypeScript's type system is pretty
               | cool though. I'll have to do more experimenting with it.
               | I mostly use Java/Go in my dayjob, and their type systems
               | definitely aren't as flexible as TypeScript's.
        
               | [deleted]
        
               | rictic wrote:
               | That's if you write it in Java. With a type system like
               | TypeScript's you can write largely the same code as
               | before, with a few annotations to clarify what you mean,
               | and you get the exact same runtime only you also will get
               | compile errors if a change elsewhere in your program
               | violates the assumptions of that code.
        
             | simplify wrote:
             | I would LOVE static typing when programming a form on a web
             | page. However, it's the fault of HTML that this is bad, not
             | static typing itself.
             | 
             | Although, in theory, one could write a parser to inject
             | what form elements are available into the type system... :)
        
               | [deleted]
        
             | duped wrote:
             | It's actually less effort since you save time writing unit
             | tests.
             | 
             | Show me an untyped program and I'll show you a program
             | missing tests and containing bugs. Static typing saves time
             | and money.
        
           | treis wrote:
           | I don't think that the industry has generally accepted that.
           | It seems pretty hotly debated AFAICT.
           | 
           | What is not debated much, AFAICT, is that it's much much
           | easier to work on large/old codebases when you have types.
           | That's really where Rails runs into issues.
           | 
           | But it's not like legacy rails monoliths start throwing NPE
           | or other type errors everywhere. It's just that developer
           | productivity grinds to a halt. Mostly for two reasons:
           | 
           | (1) You have little idea where the code your modifying is
           | used. Metaprogramming and indirection through send and
           | constants make it hard to find every place it's called.
           | 
           | (2) If you're the 5th function in the chain you have no idea
           | where your parameters are coming from. So you have no idea
           | what type they are and method autocompletion doesn't work.
           | Especially annoying when things get complex and you end up
           | with multiple similar but slightly different representations
           | of things.
        
           | jrockway wrote:
           | Yeah, I think this is what a lot of people miss. When I only
           | used dynamic languages, I told everyone that they were the
           | greatest thing ever and they were idiots for using static
           | languages. Then I started using static languages and would
           | never go back to dynamic languages. (OK, I still write Emacs
           | Lisp.) All the things I thought were great about dynamic
           | languages were actually a huge waste of my time, but I didn't
           | know because I never really explored the other side of the
           | world.
           | 
           | I have looked at modern Ruby projects, and my assessment is
           | that I absolutely would never want to be responsible for code
           | like that. It's all way too magical, if you see code that
           | says something like "foo.bar", you really have no way of
           | figuring out where the code for "bar" is. "bar" may not even
           | appear as a literal sequence of characters in the
           | application's codebase, or even in the libraries it includes.
           | 
           | If you like that, that's fine, but I wouldn't touch it with a
           | ten foot pole. I don't find it that enjoyable, even if it
           | does save me time today when I'm typing in the code.
        
             | vlunkr wrote:
             | > even if it does save me time today when I'm typing in the
             | code
             | 
             | IMO this is the strength of Ruby/Rails. You can have
             | something up and running incredibly quickly, but for
             | complex applications it can easily become a mess. It's not
             | easy to know where something is defined, what type it is,
             | if it can be nil, if you're unknowingly calling the
             | database one or one hundred times with your fancy one-
             | liner, etc.
             | 
             | Of course you CAN structure it all nicely beforehand, and
             | even use type systems, but that's hard to get right, and at
             | that point, you might as well use something else.
        
         | SanderNL wrote:
         | I get your and the article's drift, but saying it won't come to
         | pass because of grumpy programmers is IMO a bit unfair. I
         | believe it'll come to pass, but it'll take a while because
         | there's not a huge need for it right now.
         | 
         | I believe the whole computing ecosystem is very shallow at the
         | moment. There are lots of tools and lots of programming
         | languages, but they are all shockingly similar. There is just
         | too much monoculture going on. We used to have APL, Lisp,
         | Prolog. Weird stuff. Weird OSes. We need more of that weird
         | stuff again. But there has to be some economic incentive for
         | that to happen and I'm not seeing it at the moment.
         | 
         | Stuff like Smalltalk or even something like Symbolics' machines
         | would be a better fit for people needing a more high-level
         | approach to computing. These tools see very little if any real
         | funding/action and my hunch is that this will change in the
         | future. Not now, but someday. When indeed perhaps the
         | philosophers, artists and psychologists of this world need to
         | do some programming. I'm not a big fan of these kinds of
         | systems, because I am one of those grumpy bastards that don't
         | agree with "123" == 123 but I do see how these paradigms can
         | fit other types of people more readily.
         | 
         | To be honest, I don't think we've even scratched the surface of
         | what is possible.
         | 
         | Edit: OK I can't resist. "012" == ? This is making me lose
         | sleep. These things are NOT the same. There, I said it.
        
           | pmichaud wrote:
           | Re: your edit, I think the real answer is that the correct
           | translation is fully context dependent, and the people who
           | want it strict want to basically force/precompute the
           | context, vs the people who want it loose want the context
           | itself to smartly decide what the string means to itself. The
           | problem is that modern paradigms are squishy about this, and
           | aren't smart enough to consistently do the right thing, so
           | real systems end up both too strict and brittle for the real
           | world domain but also too loose and ambiguous to be bug free.
        
         | cannabis_sam wrote:
         | >Static typing everywhere. It's utterly baffling to me.
         | 
         | I find it far more baffling that people don't want to offload
         | the trivial parts of the mental work of ensuring the programs
         | they write makes the minimum of sense.
         | 
         | I also jumped on the dynamically typed bandwagon after using
         | low value type systems like java's, but after using haskell,
         | ocaml, typescript, purescript, rust, and especially elm, I
         | realized that they let me focus on the business value over the
         | incidental complexity from having any value potentially being
         | anything...
         | 
         | (Even Agda and Idris have been amazing revelations in this
         | context, but at that point the type theory does start to
         | consume more time than necessary for ordinary development)
        
           | fuzzy2 wrote:
           | I also like statically typed everything. But I have to admit,
           | some of the more adventurous stuff people do with JavaScript
           | (that just works because it is dynamically typed) is pretty
           | ergonomic. Even with TypeScript it is often next to
           | impossible to make it strongly typed.
           | 
           | I guess Ruby or even Ruby on Rails is very similar, with the
           | ability to monkey-patch just about everything.
           | 
           | Some things are just better (left) dynamically typed.
        
         | OkayPhysicist wrote:
         | I agree with you that "Re-write your Ruby project in Rust" is a
         | terrible suggestion. Pretty much only "Re-write your C++
         | project in Rust" makes any sense.
         | 
         | But it's not all bad. Elixir is pretty widely considered to be
         | the Ruby successor. Types are replaced almost everywhere by
         | pattern matching, the widely accepted unexpected behavior
         | response is to just not handle it, crash the "process" (green
         | thread) and continue on with life, integers don't overflow, and
         | the macro system is powerful enough to do just about anything
         | you want.
        
           | Mikeb85 wrote:
           | > Elixir is pretty widely considered to be the Ruby successor
           | 
           | Ummm what? Elixir is just a friendlier Erlang. It in no way
           | replaces anything Ruby does...
        
           | yifanl wrote:
           | > Elixir is pretty widely considered to be the Ruby
           | successor.
           | 
           | Really? That feels really odd, once you get past the surface
           | level syntax, Elixir doesn't really resemble Ruby to me,
           | unless you've conditioned yourself to write purely functional
           | Ruby?
        
             | Tao3300 wrote:
             | Here I thought it was a gateway drug into Erlang
        
               | yifanl wrote:
               | You can certainly treat it as a nicer interface into the
               | BEAM VM, but it's certainly possible to never write a
               | line of Erlang while being an amateur Elixir developer.
               | 
               | Though I'll have to defer to others if its also possible
               | as a professional.
        
         | lcall wrote:
         | What I would like, as a step forward at least, is something
         | that fills your ruby (or python) niche, but based on Rust, and
         | when in doubt thinks like rust, so that one can migrate from it
         | to full Rust, with a minimum of re-learning. Same libraries,
         | making them as good as Rails and as easy as Ruby in general,
         | garbage collection, etc. But when you flip a switch (or
         | incrementally, in 2-4 levels?) the full compiler checks kick
         | on, garbage collection is off by default, and it lets you
         | specify the details that give rust-like performance, features,
         | and, of course, ease of distribution (a single, smaller
         | binary). With no re-learning of a whole new language -- taken
         | in steps, if/when one is ready to grow.
         | 
         | That way it could be recommended to someone who would otherwise
         | not be willing to take on a harder language, and they have a
         | growth path. Or for a computer science program, to grow into it
         | all incrementally.
         | 
         | And then yes, make whatever improvements in the OP article,
         | from there.
        
         | disantlor wrote:
         | I dont fear magic as much as magic* where the * is all the
         | exceptions that had to be hacked into the magic to make it work
         | on the slightly different use case than what the magician
         | dreamt up
        
         | zestyping wrote:
         | Oh really? Suppose x = 123 and x = "123" were "THE SAME THING".
         | 
         | What's x + "42"?
         | 
         | What's x + "042"?
         | 
         | What's x + "a"?
         | 
         | What's x + "e2"?
         | 
         | What's x + "e2" + 12345?
         | 
         | What's x + "1,500"?
         | 
         | What's 1 / x?
        
           | wvenable wrote:
           | To be fair, that's more weak vs. strong and not static vs.
           | dynamic. You can have a dynamic typed language where all
           | these are _cough_ runtime errors.
        
             | nyanpasu64 wrote:
             | If 123 and "123" were the same thing, then 123 + 123 must
             | be equivalent to "123" + "123", and 123 + "123" cannot be
             | made a runtime error. And I do think PHP (the poster child
             | for weak typing, second to Bash) uses a separate . operator
             | for string concatenation (rather than +), and relies on I
             | think -> for object field access.
        
       | kgr wrote:
       | I think FOAM does most of what the author is asking for.
       | 
       | A quick explanation is provided in this video:
       | https://www.youtube.com/watch?v=S4LbUv5FsGQ
       | 
       | And more details can be found at:
       | https://github.com/kgrgreer/foam3#videos
       | 
       | FOAM is a modelling framework that generates cross-language
       | boilerplate for you, but it takes a much broader view of what
       | constitutes boilerplate than most systems. Typically, it can
       | generate between 95-98% of a working cross-language cross-tier
       | system.
       | 
       | FOAM helps you create features for modelled data. Features
       | include things like a Java/Javascript/Swift classes to hold your
       | modelled data, code to marshall to/from JSON/XML/CSV/etc.,
       | various GUI Views, and support for storing your data in various
       | databases or file formats. However, FOAM models are themselves
       | modelled, meaning they're afforded all of the above benefits as
       | well. This lets you apply the MVC technique of having multiple
       | views work against the same underlying data-model concurrently
       | (say a grid and a pie-chart in a spreadsheet), so that you can
       | choose the best view or views for your current need. When treated
       | this way, your code is no longer text (but it can be, if that's
       | one of your views), and you can easily view and store it in many
       | different ways and more easily programmatically manipulate it.
        
       | 7373737373 wrote:
       | Access and Resource Security - I want to look at a program and be
       | able to tell "this program will never be able to do/write/read X"
       | _at one glance_. Encapsulation, capability security and metering
       | all the way. Let every dependency be in its own sandbox, with the
       | minimum rights it needs. We need a language that can do all that,
       | without relying on another language to spin off more sandboxes
       | (like WebAssembly which requires Javascript) and without overhead
       | - one that supports  "internal encapsulation" instead. And not an
       | incomplete approach like Java either, instead create a VM that
       | _ensures_ a sandbox can never access anything external, unless it
       | is explicitly imported /passed.
        
       | manv1 wrote:
       | What we need before all this is a better way of specifying
       | program behavior, both at a high and a low level.
       | 
       | In mobile there are multiple tools that you can use to prototype
       | UI behavior. They allow you to specify navigation, transitions,
       | clickable areas, behaviors when clicked, swipe actions, etc.
       | They're this way so that the UI behaviors can be seen before
       | coded (to an extent - not every prototyping tool does
       | everything).
       | 
       | For code, well, only formal specifications get to that level. I
       | haven't actually seen one of those outside of software
       | engineering books, but I presume they exist in more critical
       | fields. Commercial software doesn't really use them because
       | they're too much work.
        
         | Taikonerd wrote:
         | This Hillel Wayne post [0] mentions a startup called
         | Sketch.systems [1], which I think is sort of like what you
         | said?
         | 
         | It's not just a UI prototype; you build a model of the
         | underlying _state_ of the system as you transition from screen
         | to screen.
         | 
         | 0: https://www.hillelwayne.com/formally-specifying-uis/
         | 
         | 1: https://sketch.systems/
        
         | dugmartin wrote:
         | There was a lot of money poured into doing this in the 80s and
         | 90s without much success. Maybe it is time to try again?
         | 
         | https://en.wikipedia.org/wiki/Fifth-generation_programming_l...
        
       | mannykannot wrote:
       | There's a touch of "let them eat cake" in the author's
       | expectation that these difficult problems could be easily solved,
       | if someone just put a little thought into it.
       | 
       | This is perhaps most clearly revealed here: "Changing the program
       | is the most common thing we need to do in our work, it's the
       | reason our job even exist. And yet, most of programmer's time is
       | spent reading or planning how to change the code." Combined with
       | the disdain for testing those changes, it seems the author wants
       | a magic programming wand.
        
         | guhcampos wrote:
         | This. The author lost me there, I just scrolled past the rest
         | to the conclusion.
         | 
         | This guys seems to believe produtivity equals amount of
         | information produced, and fails to grasp the basics of creative
         | work, which is exactly thinking.
        
       | jmull wrote:
       | The author wants to do away with the program as text source code
       | but doesn't suggest another way to represent a program.
       | 
       | You're going to have to perceive and manipulate your program in
       | some way. Maybe it will be great to get rid of code, but then
       | what will you have instead?
        
         | michelledepeil wrote:
         | I think you misinterpreted that. Their gripe wasn't with a
         | textual representation of code, but the fact that we interact
         | with it as text, not in any form. And that fundamentally limits
         | the power of the tools we use to interact with it, according to
         | the OP.
         | 
         | Of course everything can have a textual representation
         | eventually.
         | 
         | Your final question, "what will you have instead?", really
         | nails the point of the article, as that's basically what the
         | author is asking (to be invented).
        
           | westoncb wrote:
           | I propose one solution here ("How to Make View-independent
           | Program Models"): http://westoncb.blogspot.com/2015/06/how-
           | to-make-view-indepe...
           | 
           | --but many people have tackled or are tackling this problem
           | ("structure" or "projectional" editor will lead you there if
           | you're curious).
        
         | aappleby wrote:
         | Plaintext is a serialization format for source code.
        
       | tonymet wrote:
       | more investment is needed in code generation . the best platforms
       | i've worked on had ample code generation tools eg to generate a
       | API out of a spec
        
       | agentultra wrote:
       | I think we need two breakthroughs (maybe three):
       | 
       | 1. Less code. Operating systems have become obscenely bloated and
       | restrictive. There is an enormous amount of power in the hardware
       | we run our stuff on these days but you can't even touch it as a
       | programmer anymore.
       | 
       | 2. Powerful proof assistants and code synthesis. I love low-level
       | programming but even the most hardcore, brilliant people I've met
       | can easily introduce show-stopping security flaws into software
       | without realizing it. It turns out that programming is hard and
       | without rigorous models and proofs humans are really poor at
       | understanding programs. We naturally hand-wave away details which
       | get us most of the way there but these are discrete systems and
       | details matter a lot.
       | 
       | As for testing... I agree, unit tests are often insufficient but
       | probably the lowest bar you could convince typical industry
       | software developers to hurdle to prove the correctness of their
       | programs. Even then, as the author notes, they will come kicking
       | and screaming with their opinions. There are far better options
       | and strategies but as soon as you mention property testing or
       | formalization you'll lose about 90% of the room so you have to
       | pick your battles.
       | 
       | The trouble is that most startups are motivated to accidentally
       | stumble upon a market niche and in this day and age that often
       | means, "something with computers." They're not in it to write
       | reliable, robust software that is efficient and performs well on
       | a target platform. They're writing code that they can cash out on
       | and never see again. Very different world.
       | 
       | The final breakthrough we need is to fund research labs again.
       | Technology isn't inevitable and civilizations in the past have
       | lost the ability to build and maintain it. We shouldn't let that
       | happen again if we can help it.
        
       | julius wrote:
       | Maybe future programming systems can use an assertive pattern,
       | where software developers only define what the software is
       | supposed to do. And the programming systems generates a program
       | that fulfills all assertions.
       | 
       | Then when the software designer finds that the software does
       | something wrong, he can simply add assertions. Its a little like
       | TDD but without coding.
       | 
       | For GUI applications it would be cool to define assertions via
       | natural language and the programming system drawing pictures to
       | explain what it understood.
        
         | meijer wrote:
         | That sounds a lot like logic programming. For some reason, it
         | did not take off.
        
         | marginalia_nu wrote:
         | > Maybe future programming systems can use an assertive
         | pattern, where software developers only define what the
         | software is supposed to do. And the programming systems
         | generates a program that fulfills all assertions.
         | 
         | Isn't this just a programming, but harder and worse?
         | 
         | We've invented programming languages to be less ambiguous about
         | what we want done, that's a feature and not a bug. It allows us
         | to avoid the struggle of lawmakers (who are programming in
         | spoken language) and lets us tell the computer exactly and
         | unambiguously what to do.
         | 
         | Natural language does not.
         | 
         | "Bang on the floor" may mean to slam the floor or to have sex
         | on the floor.
         | 
         | There's a programming joke that goes like a programmer's
         | partner says "Go to the store and buy a loaf of bread, and if
         | they have eggs, buy twelve". The programmer comes back with
         | twelve loaves of bread.
         | 
         | Time flies like an arrow, fruit flies like a banana.
        
         | Taikonerd wrote:
         | Like declarative programming? [0]
         | 
         | I agree with you: assertions in natural language would be a
         | killer app.
         | 
         | [0]: https://en.wikipedia.org/wiki/Declarative_programming
        
         | jackling wrote:
         | This kinda sounds like Prolog. Add a bunch of assertions and
         | write a query to validate if it's true/get the missing vars.
        
         | simiones wrote:
         | We only need to invent AGI, and we'll get this, but not before.
        
         | RcouF1uZ4gsC wrote:
         | My intuition is that making all the assertions to write correct
         | code with decent performance and scaling is at least as
         | complicated as writing the code.
        
         | AnimalMuppet wrote:
         | Here's a phrase for you: "malicious compliance".
         | 
         | When I say "what" but not "how", I am trusting the system to be
         | reasonable in the "how" it generates. But "reasonable" depends
         | on my situation. Unless the system knows and understands that,
         | it may easily do what I said, but do something that is anywhere
         | from non-optimal to disastrous.
         | 
         | And if I have to say enough to prevent that - to prevent _all_
         | the ways that could happen - is that more efficient, or less,
         | compared to just writing the code myself?
        
         | cholantesh wrote:
         | Isn't that what low-code solutions claim to offer?
        
           | jocro wrote:
           | This is closer to no-code, but yeah.
           | 
           | Main reason to make the distinction is that most systems that
           | parade themselves as "low-code" today are IME
           | indistinguishable to high-code development to your average
           | joe.
           | 
           | Even taking this example, the level of value totally depends
           | on the degree of abstraction you can trust the computer to
           | perform for you. There is a tremendous amount of nuance to
           | human language and while we've come a very long way in that
           | field of study, it's still a hard nut to crack.
        
             | cholantesh wrote:
             | I would agree. In my current role, we have a dedicated,
             | growing team that builds such applications which tells me
             | all I need to know.
        
       | 082349872349872 wrote:
       | > _usually the biggest problem is an enormous amount of CRUD
       | boilerplate that looks very similar in each project, but it 's
       | nevertheless different in important details._
       | 
       | Once upon a time, a lot of microprocessor code was written in
       | assembly. Then C came along, and many of the assembly people
       | said: "whoah, hold on, I use different calling conventions in
       | different places for good reason; what do you mean every C
       | function is going to use a whole stack frame even if it's never
       | re-entered?" But now 99+% of programmers don't care about sub-kb
       | stack frames, and probably most of them even consider C too low-
       | level[0] to touch.
       | 
       | I've said elsewhere[1] that much of the ceremony of cloud sw dev
       | reminds me of 1960's mainframes -- so what is the equivalent of a
       | "structured programming" toolchain for the cloud, that takes some
       | higher level description of inputs, outputs, and logic[2], and
       | then generates not-entirely-ludicrous boilerplate to mash it all
       | together?
       | 
       | [0] in hindsight, C's big advantage back in the day was that it
       | mixed much better with assembly than purer HLLs.
       | 
       | [1] https://news.ycombinator.com/item?id=32467919
       | 
       | [2] compare the "environment division" of COBOL with Terraform,
       | and the "data division" with Swagger. I mean, we've definitely
       | progressed on many fronts since then, but certainly not on the
       | axis of "lack of verbosity"[3].
       | 
       | [3] OTOH, Conway's law suggests that multiple-team projects will
       | always wind up with multiple configuration in multiple places.
        
         | marcosdumay wrote:
         | The interesting part is that no, function calls do not all use
         | an entire stack frame, unless you compile your code for
         | debugging. Compilers are smart enough to reencode the calling
         | into just registry shifting, or even inline the entire thing.
        
           | 082349872349872 wrote:
           | Yes, they do now. In 1978, they did not. (although maybe even
           | then things like BLISS, on minis, did?)
           | 
           | The machine I learned C with maxed out at 64K data. Needless
           | to say, the compiler was not doing much beyond peephole
           | optimization.
        
       | loquisgon wrote:
       | The essential complexity in today's coding is that code is
       | created by humans. Therefore humans, we have to understand
       | existing code bases to modify them and this is non-trivial. We
       | also have to understand "what" needs to be built, that is the
       | infamous "requirements". I think eventually coding will be
       | automated away with artificial intelligence. I did not think like
       | this for a long time in my career (that programming will be
       | automated I mean) but neither I thought that computers would be
       | able to create "deep fakes" and things like understanding &
       | speaking human languages.
        
       | MiguelX413 wrote:
       | > We spend endless amounts of time bikeshedding the right syntax,
       | indentation level, tabs vs spaces, or where to put code in the
       | structure of files, but this all feels just pointless - these are
       | all properties of text, but the text is just a tool to manipulate
       | some abstract model of the program.
       | 
       | This is why I always use black for Python, cargo fmt, prettier,
       | etc. for my code.
        
       | mikewarot wrote:
       | >Also notice how writing the refactoring as a query over the
       | model is actually not that difficult. I can imagine how I would
       | write an SQL query like that in a few lines. On the other hand,
       | writing an automated refactoring system in IntelliJ or VSCode
       | sounds like a lifetime problem, and it's kinda unsolvable.
       | 
       | No, it really isn't unsolvable. I saw the demo for DION[1] after
       | following a comment[2] here, and it was close enough to some
       | ideas that I also thought were unsolvable, until I saw their
       | demo. They made a brilliant choice, use the model to regenerate
       | source code. This transforms the problem into something much
       | easier to work on.
       | 
       | I'm an old Pascal programmer, so I did what I always do, fired up
       | Lazarus (the Free Pascal based IDE) and started writing code.[3]
       | It doesn't do any actual work, except for showing off the main
       | concept. Abstract syntax tree on the left generates almost usable
       | Pascal code on the right. Selecting code then selects the right
       | part of the tree that generated it. I've only got a few hours
       | into it, and it's already doing things I would have thought
       | impossible, trivially. There's no reason you, dear reader,
       | couldn't do the same with your own programming language.
       | 
       | We're at one of those points in history where 5 people invent the
       | same thing. The future is going to be a lot better once we can
       | directly manipulate Abstract Syntax Trees instead of source code.
       | 1 - https://media.handmade-seattle.com/dion-systems/   (watch the
       | 1st video!)       2 -
       | https://news.ycombinator.com/item?id=32372707       3 -
       | https://github.com/mikewarot/treehouse
        
         | panstromek wrote:
         | > No, it really isn't unsolvable.
         | 
         | I was talking about some specific cases - e.g. rename is
         | unsolvable for some languages with macros (like Rust, in the
         | linked article). Of course, DION solves that by going from
         | opposite direction, which I think is the key (also got a lot
         | inspired about this from their demo)
        
       | gervwyk wrote:
       | Excellent insights in this article.
       | 
       | I've approached building web apps as data models. It works really
       | well for our team. This was how / why we started to develop
       | Lowdefy [0], to express a web application with a data model.
       | We've been experiencing the benefits of this - I really need to
       | start writing about it.
       | 
       | Writing this app model in json or yaml might not be ideal start,
       | but once you have that creating a IDE / GUI builder / next thing
       | on top of that becomes really a simple task while reaping all the
       | benefits of defining an program / app as a data model.
       | 
       | [0] - https://github.com/lowdefy/lowdefy
        
         | panstromek wrote:
         | That looks pretty cool, I will look at that. I already had this
         | idea many times (and I think anybody who done some web stuff
         | must have had, too), but it always felt apart when you consider
         | all edge cases you want to handle differently.
        
           | gervwyk wrote:
           | Thanks. Yeah, we've been building all kinds of things.
           | Anything form dashboards, crud, public forms, ver advanced
           | forms with complex validation and logic and even full MRP and
           | CRMs. Of course there is an egde, for now it's stuff like
           | pub/sub, server oauth etc. But mostly seems like these edge
           | cases can be supported as features later.
           | 
           | It seems like the abstraction is working really well thus
           | far, separating the business logic, into operator functions,
           | from the app and backend stuff is really key to this.
           | 
           | Really looking forward to the next phase where we get to
           | create all nice programs tools in front of the program model
           | to provide a superior dev ex :)
        
       | SKILNER wrote:
       | Great post - the one word missing, "maintenance." Most
       | programming work is done maintaining/enhancing existing code. The
       | greenfield work is a piece of cake by comparison.
       | 
       | You want to do the hard stuff? Maintain existing code you're not
       | familiar with.
       | 
       | The problems around maintaining unfamiliar code are huge, largely
       | unsolved, expensive and risky. There's a little branch of
       | computer science called Program Comprehension and no one pays any
       | attention. Though most programming money is spent on maintenance.
        
         | [deleted]
        
         | vlunkr wrote:
         | I've also wondered if it's time to back off on agile a bit. Or
         | at least "agile" as it is implemented generally, which means we
         | get to make up new requirements every two weeks. In my
         | experience, the hardest maintenance problems occur because
         | we're trying to re-shape code into something that the
         | developers never knew would be coming down the line. Spending
         | lots more time up-front deciding requirements would go a long
         | ways towards more maintainable code.
        
           | BurningFrog wrote:
           | The part of Agile a lot of people ignore is the phase when,
           | after your code works, you spend as much time as it takes to
           | make it well structured and readable to others.
        
           | bmitc wrote:
           | It's interesting to me that people are so into Agile when it
           | simply doesn't work all by itself. How many books,
           | conferences, certifications, practitioners, evangelists, etc.
           | does it take to make a paradigm, supposedly _the_ paradigm,
           | of working actually work? Every company I have worked for
           | that used Agile basically had broken processes and were not
           | productive. The one job where we did not explicitly use Agile
           | was actually a place where I produced the most useful work.
           | 
           | If the number one answer to we're using Agile but it's not
           | working is "you're doing Agile wrong", then maybe Agile isn't
           | the solution?
           | 
           | The way I worked at the place that did not have an explicit
           | process was one of switching between agile and waterfall
           | methods. Early on in the projects, the process was primarily
           | waterfall, defining things up front, building prototypes,
           | laying out the project, etc. Then once passed that stage,
           | projects would enter into a more agile or iterative process.
           | Then as new big features came in, back to waterfall and then
           | switching to agile once that stabilized. This worked quite
           | well.
        
         | tppiotrowski wrote:
         | Working on old but popular software is where legends are made.
         | You need to be methodical about changes. How do you make
         | changes in a million line+ codebase without breaking anything
         | for millions of existing users? This challenge is reserved for
         | the finest engineers on the planet. These are the people you
         | want your desk near when you start your professional career as
         | a programmer.
        
           | baq wrote:
           | this is simpler than it sounds - the process trumps any
           | engineering stardom. the process is king. the process is
           | love, the process is life, quite literally. getting any
           | change in there isn't so much fine engineering as it is
           | wrestling with layers and layers of process, where every
           | layer has been added due to a monumental f-up in the past.
           | it's an environment where getting any change committed into a
           | repository usually takes weeks, unless one of processes for
           | sidestepping the process is invoked.
        
         | synergy20 wrote:
         | A huge opportunity here: ways to assist developers to figure
         | out how existing code base works by generating code flow, class
         | hierarchy, etc.
         | 
         | yes there are a few tools on the market, nothing really
         | standout though, maybe it's for AI/ML to innovate in this
         | field.
         | 
         | Linux kernel is well designed, in that I can add code
         | relatively easy into its subsystems, it's those Object oriented
         | or FP code base that bothers me the most, especially when
         | they're large, often times they just made me feel hopeless,
         | good tools desperately needed.
        
         | danielvaughn wrote:
         | I always tell my clients - the difference between writing code
         | and maintaining it, is the difference between raising your
         | hands and keeping them raised indefinitely.
        
           | deepakkarki wrote:
           | Or the difference between conceiving a child and raising one
           | :)
        
             | danielvaughn wrote:
             | Ha, love this one.
        
             | metaltyphoon wrote:
             | I always smile when a green field project starts and then
             | they claim its "Clean Code". No, you won't known if it was
             | clean code until years down and the system will need
             | updates. Then and only then you can reflect and see how
             | hard it was to changes things in it.
        
               | tacitusarc wrote:
               | My metric for clean code is how quickly a developer
               | unfamiliar with it can understand it
        
               | agumonkey wrote:
               | It seems that anything successful, for any given era, is
               | the one thing that minimize time to understanding better
               | than others.
        
               | tomphoolery wrote:
               | I mean, a green field project is about as clean code as
               | you can get. It's (reported) bug-free!
        
               | tasuki wrote:
               | Fully agreed. No matter how "clean code", the next person
               | or team is immediately going to label it "legacy" and
               | complain endlessly about all the choices made by the
               | original author(s).
        
               | Jensson wrote:
               | Many dependencies? Updating them is hell, remove
               | dependencies and just write the utilities we need so we
               | can update to latest easily!
               | 
               | Few dependencies? Too much reinventing the wheel, delete
               | all that code and add dependencies!
               | 
               | There is no perfect code, can always make different
               | trade-offs and move things around.
        
               | [deleted]
        
             | agumonkey wrote:
             | raising someone else's that is already 4yo and emotionally
             | harmed
        
               | pojzon wrote:
               | This hits home. You win.
               | 
               | Maintaining and cleaning up a mess someone left behind
               | are two different things.
        
           | [deleted]
        
           | baq wrote:
           | great analogy. totally stealing this.
        
           | iovrthoughtthis wrote:
           | powerful image!
        
         | bsedlm wrote:
         | yes. I wish I could somehow get to work on a blend between: a
         | decompiler, debugger, emulator, static analyzer, memory
         | profiler, and so on.
         | 
         | The idea being some kind of a runtime for assembly code which
         | does not actually execute the program but allows one to
         | understand it in different sematinc levels, or dunno.. this is
         | a very raw idea. needs a lot of work (and a lot more
         | knowldedge) to set down.
         | 
         | too bad none of the professors that I was able to meet were
         | really interested in this kind of thing
        
           | Banana699 wrote:
           | I think dynamic analysis is incredibly powerful and
           | criminally underused in IDEs and other dev tools.
           | 
           | I have thought of an idea about 6 months ago that has been
           | fermenting in my mind since then : what if (e.g.) a Python VM
           | had a mode where it records all type info of all identifiers
           | as it executed the code and persisted this info into a
           | standard format, later when you open a .py file in an IDE,
           | _all_ type info of the objects defined or named in the file
           | are pulled from the persistent record and crunched by the IDE
           | and used to present a top-notch dev experience?
           | 
           | The traditional achilles's heel of static analysis and type
           | systems is Turing Completeness, traditional answers range
           | from trying and giving up (Java's Object or Kotlin's Any?),
           | not bothering to try in the first place (Ruby, Python,
           | etc...), very cleverly restricting what you can say so that
           | you never or rarely run into the embarrassing problems
           | (Haskell, Rust,...), and whatever the fuck C++'s type system
           | is. The type-profiling approach suggests another answer
           | entirely : what if we _just execute the damn thing_ without
           | regard for types, like we already do now for Python and the
           | like, but record everything that happens so that later static
           | analysis can do a whole ton of things it can 't do from
           | program text alone. You can have Turing-Complete types that
           | way, you just can't have them immediately (as soon as you
           | write the code) or completely (as there are always execution
           | paths that aren't visited, which can change types of things
           | you think you know, e.g. x = 1 ; if
           | VERY_SPECIFIC_RARE_CONDITION : x = "Hello" ).
           | 
           | You can have incredibly specific and fine-grained types, like
           | "Dict[String->int] WHERE 'foo' in Dict and Dict['bar'] ==
           | 42", which is peculiar subset of all string-int dictionaries
           | that satisfy the WHERE clause. All of this would be
           | "profiled" automatically from the runtime, you're already
           | executing the code for free anyway. Essentially, type-
           | checking and inference becomes a never-halting computation
           | amortized over all executions of a program, producing
           | incremental results along the way.
           | 
           | I have ahead of me some opportunity to at least have a go at
           | this idea, but I'm not completely free to pursue it (others
           | can veto the whole thing) and I'm not sure I have all the
           | angles or the prerequisite knowledge necessary to dive in and
           | make something that matters. If anyone of the good folks at
           | JetBrains or VisualStudio or similar orgs are reading this :
           | please steal this idea and make it far better than I can, or
           | at least pass it to others if you don't have the time.
        
             | mst wrote:
             | Shit. Also. This has actually been attempted.
             | 
             | Urbit "infers" types from functions by executing them with
             | type objects so the relevant bindings themselves return
             | type objects.
             | 
             | If you can skip over both the syntax and the creator, there
             | are some intesting things to be found in there.
        
             | rileyphone wrote:
             | The idea of runtime type feedback was originally explored
             | by the SELF group for optimization [0], and is currently
             | used by JS runtimes like V8. The obstacle your vision faces
             | today is that program editors are almost all completely
             | separate to the languages they are used for, and thus such
             | communication with the runtime is enormously painful and
             | complex. Time to return to the truly integrated development
             | environments of Smalltalk/Lisp with modern niceties like
             | gradual types and multicore processors, methinks!
             | 
             | [0] https://dl.acm.org/doi/pdf/10.1145/178243.178478
        
             | chowells wrote:
             | I think if you have to run a whole program to understand a
             | small part of it, you've already lost. The most valuable
             | tools are a REPL that can execute units of your code, and a
             | language that enforces purity and immutability so that
             | local reasoning is more likely to be sufficient.
        
             | RyanCavanaugh wrote:
             | This is how JavaScript intellisense in Visual Studio used
             | to work, except that the program was executed "behind the
             | scenes" using a trimmed-down VM that could execute without
             | side effects or infinite loops. It was eventually abandoned
             | due to poor performance, predictability, and stability.
             | 
             | The problem is this dilemma: If you have to wait for a
             | "real" execution of a program, then very reasonable
             | expectations like "I can see a local variable I just
             | declared" doesn't work. If you try to fake-execute a
             | program, you have problems like trying to figure out what
             | to do with side-effecting calls, loops, and other control
             | flow problems.
             | 
             | Trying to reconcile a previous type snapshot with an
             | arbitrary set of program edits was tried by an early
             | version of TypeScript and wholly abandoned because it's
             | extremely difficult to get right, and any wrongness quickly
             | propagates and corrupts the entire state. The flow team is
             | still trying this approach and is having a very hard time
             | with it, from what I can tell.
        
             | SKILNER wrote:
             | I developed a dynamic analysis/IDE tool for old IBM
             | systems. I was told by VC's that IT management never spends
             | significant money on programmer productivity. I think
             | they're mostly right. Maybe because no one knows how to
             | actually measure it.
        
             | mtVessel wrote:
             | This is only feasible if the program takes no input, or a
             | very limited set. Once you open it up to arbitrary input,
             | no single run (or even a large set of runs) can capture
             | everything the program might be expected to handle.
             | 
             | How does the type profiler know that the variable that only
             | contained values like "123" or "456" was handling
             | _identifiers_ , not numbers?
        
               | Banana699 wrote:
               | >This is only feasible if the program takes no input, or
               | a very limited set.
               | 
               | One of the insights that people making tools for dynamic
               | languages discover over and over again is that most
               | _uses_ of dynamic features is highly static and
               | constrained. In general, yes, a python program can just
               | do eval(input( "enter some python code to execute :)
               | \n>>")), but people mostly don't do this. People use
               | extremly dynamic and extremly flexible constructs and
               | features in very constrained ways. This is like the
               | observation that most utterances of human languages are
               | highly constrained and highly specific, even within
               | syntactically-valid and semantically-meaningful
               | sentences, not all utterances are equally probable, and
               | some are so improbable as to be essentially irrelevant.
               | People who try to memorize the dictionary never learn the
               | language, because the vast majority of the dictionary is
               | useless and mostly unused, and even the words that are
               | used are only used in a subset of their possible
               | meanings.
               | 
               | >Once you open it up to arbitrary input, no single run
               | (or even a large set of runs) can capture everything the
               | program might be expected to handle.
               | 
               | Anything is better than nothing, right ? if your program
               | keeps executing with some set of types over and over
               | again (and it will, because no program is infinitely-
               | generic, the human brains that wrote the code can't
               | reason over infinity in general), wouldn't it be better
               | to record this and make it avilable at static write-time
               | ?
               | 
               | Human brains are finite, how do we reason over the
               | "infinite" types that every Python program theoretically
               | deals with ? We don't! like I said, most dynamic features
               | are an illusion, there is a very finite set of uses that
               | we have in mind for them. Here is an experiment you might
               | try, the next time you write in a dynamic language, try
               | to observe yourself thinking about the code. In the vast
               | majority of cases, you will find that your brain already
               | has a very specific type in mind for each variable (or
               | else how can you do anything ? even printing the thing
               | requires assuming it has a __repr__ method that doesn't
               | fail.).
               | 
               | >How does the type profiler know that the variable that
               | only contained values like "123" or "456" was handling
               | identifiers, not numbers?
               | 
               | It doesn't. I think you misunderstood the idea a little,
               | the type profiler makes no attempt whatsoever at
               | discerning the "meaning" of the data pointed to by
               | variables, it will only record that your variable held
               | strings during runtime. If the number of string values
               | the variable held was small enough, it might attempt to
               | list them like this "Str WHERE Str in ["123","456"]". If
               | the number of values the variable held was larger than
               | some threshold but some predicate held for it
               | consistently it can also use that, i.e. "Str WHERE
               | is_numeric(Str)". If a string variable was always tested
               | against a regex before every use, it will notice that and
               | include the regex into the type. No additional "smart
               | pants" than this is attempted, just the info your VM or
               | interpreter already knows, just recorded instead of
               | thrown away after each execution.
               | 
               | The profiler will not and can not attempt to understand
               | any "meaning" behind the data nor it needs to in order to
               | be useful, it's just a (dynamic) type system. No current
               | type system, static or otherwise, attempts to say "'123'
               | is a numeric, would you like to make it an int ?", that
               | would be painful, absurd in most cases I can think of and
               | misguided in general.
        
               | samatman wrote:
               | > _No current type system, static or otherwise, attempts
               | to say "'123' is a numeric, would you like to make it an
               | int ?"_
               | 
               | SQLite's column type affinity will in fact do this, if
               | you tell SQLite that a column is an INTEGER it will turn
               | '123' into 123 but will happily take a string like
               | "widget" and just store it.
               | 
               | I also wanted to add that your thoughts on this subject
               | are well-stated and align with some work I've been
               | patiently chipping away at, in the intersection of
               | gradual typing and unit testing. I'll have more to say on
               | that subject someday...
        
               | herdrick wrote:
               | Correct, that's why you use the large dataset available
               | to you -- tons of runtime data from production.
        
               | herdrick wrote:
               | It would seem like that's getting the types too late to
               | be useful, but in practice most code goes into production
               | in stages, so you could start getting this probabilistic
               | typing data from code that has rolled out in a limited
               | way, for example features that are hidden to most users.
        
             | int0x80 wrote:
             | Something very close to this can be done and it's in fact
             | done already by static analysis. Static analysis doesn't
             | have any Turing complete problem. Static analysis has a
             | limitation of providing _complete_ answers because of the
             | halting problem, but it can provide instead _sound_
             | answers. That is, static analysis can provide all possible
             | runtime types for any given (e.g. python) expression. This
             | can be accomplished by doing Abstract Interpretation, or
             | Constraint Analysis and Dataflow Analysis (kCFA), which is
             | in way similar to what you suggest of running the program
             | in a profiler, but instead it runs the program in an
             | abstract value domain. With static analysis you will get
             | some imprecisions (false positives) but no false negatives,
             | so it can effectively be very useful for a developer in an
             | IDE. The precision (amount of FPs) and performance are
             | mutually dependent, but good performance and reasonable
             | (read useful) precision can be achieved, although it 's a
             | non-trivial engineering problem.
             | 
             | Additionally, some programs cannot be easily and/or quickly
             | executed to cover all possible paths, so parts of the
             | program will remain uncovered by the profiler. That is one
             | place where static analysis becomes very powerful, because
             | you can cover all the program much faster (in linear time
             | making largish precision tradeoffs, but analysis still
             | yielding a usable result).
             | 
             | source: I work on a flagship static analyzer.
        
               | bsedlm wrote:
               | do you know any textbooks on abstract interpretation?
        
               | int0x80 wrote:
               | "Principles of Program Analysis" covers the subject very
               | well. It's not an easy or beginner book because it's very
               | formal, but very complete and with plenty of examples.
        
               | Banana699 wrote:
               | Indeed, Abstract Interpretation is powerful and beautiful
               | as heck. Type Systems can be seen as just a special case
               | of general Abstract Interpretation, where the types are
               | the abstract values computed from each expression. The
               | problem is that it requires ingenuity to devise abstract
               | value systems that don't degrade into useless generality
               | as unknown branches in the code 'execute'. Even types
               | only succeed as much as they do because they require
               | extensive and invasive (language-design-changing as well
               | as program-changing) cooperation from both the language
               | designer(s)\implementer(s), as well as the language
               | developer(s), without this cooperation you will leave
               | open very wide gaps. Symbolic Execution is another much
               | much more powerful technique but, predictably, also very
               | inefficient in general.
               | 
               | My way of looking at this is just frustration at the
               | misallocation of resources. Dynamic programs already have
               | tons of typing information available, just not in the
               | right time and place. Your brain spends an aweful lot of
               | time "executing" the code of a dynamic language while
               | it's writing the code, just like the language runtime
               | only far more slowly and with a sky high probability of
               | error. So all what I'm saying is, why this immense
               | suffering, when the information that your brain is in
               | dire need of is already right there in the interpreter's
               | data structures, just in opaque and execution-temporary
               | forms ? It strikes me as incredibly obvious to try to
               | bring in those typing information from the runtime into
               | persistent transparent records available at dev-time.
               | 
               | Abstract Interpretation or Symbolic Executation are
               | (fancy) tools in programming language theory's toolbox
               | that can help us, but the simplest possible thing to try
               | first is to make use of the already-available information
               | that are just lying around elsewhere. To make a somewhat
               | forced analogy : if we have a food crisis at hand, we
               | could try fancy solutions like genetic engineering of
               | super crops or hydroponic farming, but the dumbest
               | possible solution to try first would be to simply bring
               | in food from other places where its plentiful. Typing
               | info in dynamic languages is very plentiful, it's just
               | not there when we need it.
        
               | int0x80 wrote:
               | The problem is what I mentioned at the end of my other
               | comment -- complex programs will get inputs from web
               | APIs, console, database, so it's not possible to have
               | complete runtime coverage for all paths in the
               | interpreter on the general case.
        
             | bramblerose wrote:
             | https://github.com/instagram/MonkeyType can perform the
             | call logging, and can export a static typing file which is
             | used by mypy, but also e.g. PyCharm. It doesn't expose such
             | fine grained types, but you could build that based on the
             | logged data.
        
             | mst wrote:
             | > The traditional achilles's heel of static analysis and
             | type systems is Turing Completeness, traditional answers
             | range from trying and giving up (Java's Object or Kotlin's
             | Any?), not bothering to try in the first place (Ruby,
             | Python, etc...), very cleverly restricting what you can say
             | so that you never or rarely run into the embarrassing
             | problems (Haskell, Rust,...), and whatever the fuck C++'s
             | type system is.
             | 
             | This stanza was maybe not your primary point but it was
             | beatifully written and multiple programmer friends of every
             | variety mentioned have been cackling at it.
        
             | sankha93 wrote:
             | There has been attempts as you describe before. I can
             | specifically point to work done in Ruby by my PhD advisor
             | using the exact profiling approach, and then static typing
             | from that: http://www.cs.tufts.edu/~jfoster/papers/cs-
             | tr-4935.pdf
             | 
             | > you're already executing the code for free anyway
             | 
             | Based on my experience of working on similar domain of type
             | systems for Ruby (though not the exact approach you
             | describe), this turns out to be the ultimate bottleneck. If
             | you are instrumenting everything, the code execution is
             | very slow. A practical approach here is to abstract values
             | in the interpreter (like represent all whole numbers are
             | Int). However, this would eliminate the specific cases
             | where you can track "Dict[String->int] WHERE 'foo' in Dict
             | and Dict['bar'] == 42". You could get some mileage out of
             | singleton types, but there are still limitations on running
             | arbitrary queries: how do you record a profile and run
             | queries on open file or network handles later? How do you
             | reconcile side effects between two program execution
             | profiles? It is a tradeoff between how much information can
             | you record in a profile vs cost of recording.
             | 
             | There is definitely some scope here that can be undertaken
             | with longer term studies that I have not seen yet. Does
             | recording type information (or other facts from profiling)
             | over the longer term enough to cover all paths through the
             | program? If so, as this discussion is about maintaining
             | code long term, does it help developers refactor and
             | maintain code as a code base undergoes bitrot and then gets
             | minor updates? There is a gap between industry who faces
             | this problem but usually doesn't invest in such studies and
             | academia who usually invests in such studies but doesn't
             | have the same changing requirements as an industrial
             | codebase.
        
         | bmitc wrote:
         | I would argue that a huge or maybe even the primary reason why
         | maintenance is so hard, though, is because a lot of software
         | was originally not written "correctly", that is without
         | maintenance and longevity in mind.
         | 
         | The hardest part of maintenance, in my experience, is that
         | programs were developed under needless or incorrect constraints
         | and then expected to be magically maintained. There is a huge
         | downstream effect of decisions made early on in a software
         | system's life.
         | 
         | The story of "just get it working" that evolves into "now
         | that's it's working, don't change it but add these new
         | features" repeats itself over, and over, and over. It's not
         | surprising why maintenance in systems developed like that is
         | hard.
        
         | dlojudice wrote:
         | the problem is that a large amount of code produced is to
         | support the accidental complexity of the software (let's call
         | it infrastructure code) while the value generated by it comes
         | from its essential complexity, that is, the application domain,
         | as cited by the article .
         | 
         | while Domain Driven Design and Clean Architecture are a first
         | step in the right direction, languages and frameworks are still
         | limited in supporting these ideas.
         | 
         | It's almost insane to think that once you have a modeled domain
         | you need to replicate them in resolvers, types, queries, etc
         | (for graphql), resources, responses, endpoints (for rest), etc,
         | etc.
         | 
         | to reinforce the point of the article and the one brought by
         | @SKILNER, I believe that the great transformation that is to
         | come is in maintainability through a focus on the domain
        
           | galdosdi wrote:
           | I think, as OP alludes, ultimately explorability is the heart
           | of the problem that stops people from writing code this way.
           | 
           | If you don't care about other people being able to read and
           | explore your code without a lot of preperation, you can go
           | full hog creating layers of DSLs and metaprogramming, and
           | with enough dedication you can end up with all your real
           | domain level business rules in one place separate from the
           | "infrastructure"
           | 
           | But if you do this, you end up with a codebase that is hard
           | for a newcomer to ask simple maintenance questions about like
           | "What are all the places XYZ is called from?" or "What are
           | all the places to write to ABC" etc
           | 
           | So an experienced developer learns to limit their
           | metaprogramming so their code retains easy explorability at
           | the expense of long term sustainability. Golang is kind of an
           | epitome of this kind of thinking. Lisps are kind of the
           | epitome of the opposite I guess.
           | 
           | This is what's behind the paradox where a good dev working
           | alone or maybe with one very like minded person can produce a
           | level of productivity you can't match again as you add
           | developers, till you have way more developers. The dip
           | represents the loss due to having to communicate a common
           | understanding of the codebase, that doesn't get adequately
           | compensated for till you've added a lot more people.
        
             | fleddr wrote:
             | A long time ago, I presented to my manager a carefully
             | crafted application, a stereotypical multi-layered
             | architecture and then some more.
             | 
             | His response: wow, that's a lot of crap just to run a sql
             | query.
             | 
             | He was fully right.
        
             | pendar747 wrote:
             | > This is what's behind the paradox where a good dev
             | working alone or maybe with one very like minded person can
             | produce a level of productivity you can't match again as
             | you add developers, till you have way more developers. The
             | dip represents the loss due to having to communicate a
             | common understanding of the codebase, that doesn't get
             | adequately compensated for till you've added a lot more
             | people.
             | 
             | Wow I couldn't agree more with this point. You put it
             | perfectly. I worked alone and later with one other
             | developer on a project and it felt way more productive than
             | my current team of 5 developers!
        
           | picsao wrote:
        
         | commandlinefan wrote:
         | > The problems around maintaining unfamiliar code are huge,
         | largely unsolved, expensive and risky
         | 
         | Not to mention massively underestimated and unappreciated by
         | non-programmers.
        
         | kanzenryu2 wrote:
         | Also possibly including: install very old OS version, get libs
         | and dependencies to some old version, and maybe update to a
         | slightly newer compatible version, but not the latest. Create
         | mock services of complex back end systems for test cases.
         | Convert https connections to http for testing, or use
         | unsupported TLS versions and protocols for some connections.
         | Then you can get started!
        
         | agumonkey wrote:
         | I sincerely don't know why uni don't make more classes on that
         | only.                 - pick any software       - try to change
         | something       - give a precise impact analysis       -
         | generate a few potential implementation paths       - measure
         | how fast you did all that and what failed / worked
        
           | AndyMcConachie wrote:
           | I agree.
           | 
           | A fundamental problem with how we teach programming is that
           | we focus on writing, instead of reading, software. To borrow
           | terminology from the language arts; we don't focus enough on
           | reading comprehension.
        
         | di4na wrote:
         | There have been interesting progress in this space from a
         | different angle of attack. o11y (Akita, honeycomb, ebpf,
         | prodfiler, ...) and "Learning from incidents" are two of these
         | angle that have really built on this idea that "understanding
         | what the system does in prod" matters far more than "writing it
         | right the first time".
         | 
         | It is also the thinking we can see supporting a lot of the
         | early devops movement.
        
       | Lapsa wrote:
       | no ideas who this fella is and too lazy to look up his huge
       | achievements. but I dislike the way he is thinking. I mean - it's
       | already there. go and research Smalltalk stuff or something.
        
       | guhcampos wrote:
       | I don't want to be too harsh but I think I strongly disagree with
       | everything the author claims, and I've scrolled through the
       | comments and found the criticism needs a touch.
       | 
       | 1. Writing glue code and boilerplate is a waste / Why not use a
       | framework?
       | 
       | The author complains about boilerplate just to circularly
       | complain about frameworks hiding "important details you care
       | about". This, to me, denotes a failure to recognize some pretty
       | basic trade-offs of any kind of development: you either create
       | your own axioms and start something new or base your work on
       | previous art by others. The more you want to customize, the less
       | prior art you can use. He seems to want to "eat the cake and have
       | it too".
       | 
       | 2. Editing code in general doesn't work well / Program is not a
       | text / Program is a model / Do we need a language?
       | 
       | This section makes no sense to me. Everything is a language,
       | whatever format he desires to abstract away all formats will need
       | a language to be coded into. Language is a tool to convey meaning
       | and achieve communication, it does not matter if it's text,
       | pictures, sounds, whatever. It just so happens that written
       | language is the single most ubiquitous communication method ever
       | developed by humanity, and the formalization of syntax and
       | semantics are there to reduce the ambiguity which is natural to
       | natural language. The author seams to believe that we should
       | achieve a single natural language that conveys meaning without
       | ambiguity, or that some other form of communication can better
       | represent the programmer intention than text. I would love to
       | understand exactly how, because to me it seems like a pointless
       | argument in the way it's presented.
       | 
       | 3. Testing/Correctness / I want simpler testing
       | 
       | Again, the author does not seem to understand WHY testing is
       | difficult. To me, it's very obvious that testing is hard simply
       | because 1. proving a complex system is hard and often impossible
       | as we all learn in CS101 and 2. Testing itself requires conveying
       | the meaning of the requirement correctly, and as with all
       | communication there are always failures in this process. Once
       | more the author seems to want a magic wand, ignore the trade-offs
       | and, I don't know, fix all communication problems ever to have
       | existed through human existence?
       | 
       | 4. What is the vision?
       | 
       | Finally, the author tries to force upon the reader an argument
       | that everyone's perspective is wrong, that some sort of
       | revolution is required - and possible - to make all these desires
       | come true. I think this misses the point by such a long shot,
       | like the good old Product Manager that "just wants things to be
       | done and doesn't care how". I may be the one incapable of
       | changing my perspective and thinking outside the box, but I have
       | a feeling that if such a revolution was possible - and most
       | importantly - unanimous - we'd had some glimpse of it already.
       | 
       | Note how every single argument of the author is - to my
       | interpretation - fundamentally tied to a communication problem.
       | All the issues mentioned converge on difficulty to encode a
       | message in such a way that it is interpreted correctly by the
       | receiver, be it a machine or a person, in a unambiguous way. This
       | problem is so much bigger than programming, so much bigger than
       | engineering, so much bigger than Science. I'd argue that this is
       | THE fundamental open problem of humanity, and believing that
       | there is some sort of final solution is extremely naive.
        
       | jacknews wrote:
       | "Writing tests is time-consuming, usually doesn't scale, and it
       | easily creates tight coupling with implementation, which makes
       | change difficult."
       | 
       | Amen.
        
         | commandlinefan wrote:
         | > The only thing worse than testing is not testing, but testing
         | is not much better.
         | 
         | Even more amen.
        
       | infogulch wrote:
       | This is part of a comment I made on The State of State Machines
       | (2021) [1] which is a Google Project Zero post about how complex
       | state machines were exploited.
       | 
       | > I feel like we will continue to run into these kinds of issues
       | to the end of time unless can figure out: 1. How to precisely
       | describe the properties we want the final system to have, 2. How
       | to 'compile' from a higher-level language/layer into a lower-
       | level language while maintaining all those properties. At the
       | least this will require us to: 3. Define the precise semantics of
       | each layer and enforce that every construction in and
       | implementation of that layer adheres to it strictly.
       | 
       | > Layers/languages should verifiably maintain these properties
       | through every translation via paths like: eula/privacy policy,
       | requirements, UX, UI, state machine, source code, AST, IR, ASM,
       | machine code. Every one of these layers should have a well-
       | defined execution model that is isomorphic with other layers,
       | modulo metadata. For example: source code === AST [+
       | comment/whitespace/filesystem metadata], AST === IR [+
       | name/desugaring/applied-optimizations metadata]. All undefined
       | behavior at every layer must be exterminated by definition or
       | avoided by construction.
       | 
       | [1]: https://news.ycombinator.com/item?id=25836398#25838252
        
       | flyaway123 wrote:
       | A lot of the thought process here seems to move into Bret
       | Victor's talk on 'Inventing on Principle'[0]
       | 
       | [0] https://youtu.be/EGqwXt90ZqA
        
         | hunterx wrote:
         | mostly just a glimpse of that talk, perhaps better suited is
         | the one about programming he gave at Dropbox. In my opinion
         | quite more in-line with what's being said.
        
       | mpweiher wrote:
       | This resonates deeply with me (and my research project).
       | 
       | 1. Glue code and boilerplate waste
       | 
       | Yes, yes and yes! Glue code is the dark matter of software [1]
       | 
       | My hypothesis is that the reason we have to write so much glue
       | code, and that it's always sufficiently different is that we
       | don't have the right architectural abstractions. Specifically,
       | our programming languages only support (essentially) procedural
       | abstraction (procedures, functions, methods).
       | 
       | With Objective-S [2][3], I've been introducing language support
       | for other architectural styles. It's been a slog, but recently
       | things are starting to really click together, particularly the
       | combination of "stores and streams" is very powerful and
       | eliminates tons of boilerplate, often reducing it to the
       | "connection operator" -
       | 
       | Which not only happens to be very brief, it's also
       | generic/polymorphic.
       | 
       | 3. Why don't frameworks work?
       | 
       | Also really very perceptive observations. Frameworks sort of
       | work, but they tend to be limited by having to represent their
       | domain in terms of procedural abstractions.
       | 
       | 4. Non-textual code/modeling
       | 
       | I don't think this is the problem. Modeling _is_ a problem, but a
       | large part of that is because the systems /models we need to
       | build are non-procedural, and so our textual code can only be a
       | meta-program or meta-system that then constructs the actual
       | system. Which is not visible/present in the code we write, but
       | only exists in the running system and in our heads. If we close
       | that semantic gap, having that model expressed textually
       | shouldn't be a huge problem.
       | 
       | The problem is not the text, it's the wrong abstractions that our
       | text expresses.
       | 
       | 5. Testing
       | 
       | Not sure the idea of generic testing is that useful, because the
       | key to testing (for me) is its concreteness. That said we can
       | reduce test friction a lot, I think. [4]
       | 
       | 6. UI construction
       | 
       |  _You don 't need UI mockups and prototypes - you just program
       | the real thing, because it's that simple. If the user doesn't
       | like it, you can completely restructure it easily._
       | 
       | Yes. I've seen a lot of mockup tools, and it always seemed
       | obvious that writing the real UI should be just as easy (or
       | easier). With NeXT's Interface Builder, we had a large part of
       | that, but sadly Apple has had it languish so horribly that
       | nowadays even imperative code is often preferable, and the fluent
       | APIs such as SwiftUI or React, Flutter etc. seem vastly
       | preferable, despite their deep flaws.
       | 
       | [1] https://blog.metaobject.com/2021/06/glue-dark-matter-of-
       | soft...
       | 
       | [2] http://objective.st
       | 
       | [3] https://news.ycombinator.com/item?id=32444300
       | 
       | [4] https://blog.metaobject.com/2020/05/mpwtest-reducing-test-
       | fr...
        
       | myco_logic wrote:
       | > _It feels like there 's an unexplored dimension of abstraction
       | here. Something where generics, interfaces and higher order
       | functions are too static and low level primitives. Something
       | where it's really difficult to pinpoint what exactly is the
       | repeated pattern here and how to exploit it. Instead of generic
       | framework that can do everything, I'd like an efficient way do
       | something specific._
       | 
       | This bit reminds me a lot of a concept Aaron Hsu mentions in his
       | fantastic talk on anti-patterns in the Iversonian languages[0], a
       | paradigm he terms "Idioms over Libraries". The idea being that
       | because of the expressive power of APL's primitives programmers
       | often opt for utilizing easily recalled snippets of symbols over
       | the importing of library code to implement common functionality.
       | This facet of array-lang culture can be seen with sites like APL
       | Cart[1], which serve as indexes of these frequently used
       | snippets.
       | 
       | I think a lot of people miss that this is one of the major
       | advantages induced by the terseness of these languages (it's not
       | just about code-golfing for the implicit joy of laconicism). By
       | allowing for the direct expression of algorithms in the same
       | context they are being used, APL and its kin enable one to tweak
       | and optimize these idioms on a case-by-case basis: precisely the
       | kind of specificity the author of this article is asking for.
       | 
       | [0]: https://youtu.be/v7Mt0GYHU9A?t=1027
       | 
       | [1]: https://aplcart.info/
        
       | rawgabbit wrote:
       | I find it interesting, there are no comments about the author's
       | argument that programming today is inefficient as the most
       | popular "model" are relational databases. "* I imagine this model
       | as a relational database...it becomes clear that using a textual
       | source code is really inefficient way to manipulate this model.*"
       | It wasn't too long ago, object oriented programming, ORMs, and
       | NOSQL was in fashion. I believe that was a dead end.
       | 
       | I don't believe relational databases are the end all or be all
       | either. What has stood the test of time is the double entry
       | accounting transaction journal entry. In this model, the journal
       | entry is the system of record. And you can have multiple
       | distributed systems creating these entries at the same time. You
       | collect and aggregate these entries to display the "balance" at a
       | specific point in time. To me, this is what Kafka distributed
       | logs powerful. Distributed logs builds on a proven concept.
        
       | bambataa wrote:
       | Text does feel like a really slow way to work sometimes.
       | 
       | A while ago in a React app I needed to keep some state around so
       | lifted it from component state hooks to a context. Very
       | mechanical work. It feels like we should be to say "move these to
       | a context consumed by A, B, C" and just have it all done
       | automatically.
       | 
       | Is there anything inherent to React/JS that stops something like
       | IntelliJ implementing that?
        
       | steve76 wrote:
        
       | carapace wrote:
       | All this stuff exists, and most of it is decades old. The reason
       | we don't make (better) use of it is that IT is a fashion driven
       | field that ignores prior art (as the author of TFA demonstrates.)
        
       | js8 wrote:
       | I would suggest to author to look at functional languages, like
       | Haskell. These are based on principles of function composition
       | and referential transparency.
       | 
       | The move from testing to static analysis is happening there, in
       | the expressiveness of the type system, and its inferences.
       | Functional languages are on the forefront of experimentation with
       | new type systems.
        
       | w10-1 wrote:
       | Programming is encoding: some reduction of reality into a model
       | suited to algorithms doing what we need.
       | 
       | The reduction to model and scope to algorithms are necessary and
       | unavoidable. All of the criticisms made are objections to the
       | selected model or limited set of algorithms.
       | 
       | That includes text as the standard "model". By contrast, IBM
       | VisualAge in the 1990's had a true AST-based model of the code,
       | and showed text as views. It did (some) amazing things, but
       | people hated it because there was no way to make it do other
       | things they wanted.
       | 
       | I would add the disparity between the granularity of commits and
       | comments. Clearly, I should be able to describe specific changes
       | in a file _and_ provide high-level account of a long-running task
       | without collapsing everything into one history.
       | 
       | Proposal: A single AST model, configurable for multiple
       | languages, with JVM & LLVM back-ends, and automagic support for
       | IDE's via LSP and program transforms like language conversion,
       | slicing, and aspects.
       | 
       | The killer app there would be transforms for parallelism to the
       | processor-specific vector instructions. That would capture more
       | of the value of the oncoming onslaught of processor
       | architectures.
        
         | galaxyLogic wrote:
         | One of the brilliant things about Smalltalk was its change-
         | management. You didn't just store programs, you stored
         | "changes" to existing programs which assumes a context of
         | existing 'classes" into which such changes can be applied.
         | 
         | Contrast that with current CVSes like git where you don't store
         | changes to the objects you create or have created earlier, but
         | just changes to which files exist in your (git-based virtual)
         | file-system.
         | 
         | Git only knows about things like "files" and "folders", not
         | about objects the user creates. Therefore you can not view a
         | git-repo as a set of changes to your "program", it is only a
         | set of changes to files and folders.
        
           | ElectricalUnion wrote:
           | Git don't even know about "folders", it's just implied from
           | file names stored in the git trees.
           | 
           | https://git.wiki.kernel.org/index.php/GitFaq#Can_I_add_empty.
           | ..
           | 
           | > Currently the design of the Git index (staging area) only
           | permits files to be listed, and nobody competent enough to
           | make the change to allow empty directories has cared enough
           | about this situation to remedy it.
           | 
           | > Directories are added automatically when adding files
           | inside them. That is, directories never have to be added to
           | the repository, and are not tracked on their own.
           | 
           | > You can say "git add <dir>" and it will add the files in
           | there.
           | 
           | > If you really need a directory to exist in checkouts you
           | should create a file in it. .gitignore works well for this
           | purpose (there is also a tool MarkEmptyDirs using the .NET
           | framework which allows you to automate this task); you can
           | leave it empty or fill in the names of files you do not
           | expect to show up in the directory.
        
       | hospadar wrote:
       | I have some beefs:
       | 
       | > To be more specific - for most web projects I work on, I have a
       | very similar yaml file for CI, Dockerfile,
       | 
       | Very similar, but not actually the same - of course there's
       | always a tradeoff between control and convenience. Maybe you
       | don't like where kubernetes, $CI_TOOL_OF_CHOICE, etc puts that
       | tradeoff, but that's why there's a zillion tools and languages
       | out there, because someone wanted a slightly different tradeoff
       | 
       | > Changing the program is the most common thing we need to do in
       | our work, it's the reason our job even exist. And yet, most of
       | programmer's time is spent reading or planning how to change the
       | code.
       | 
       | I think I fundamentally disagree with the idea that "reading or
       | planning" are second-class activities here. I think that one of
       | the highest purposes of a programming language is is to
       | communicate to other humans, unambiguously, what the program is
       | intended to do.
       | 
       | I think most languages have a sweet spot for "good at
       | communicating for $TYPE_OF_PROBLEM" - it'd be a nightmare to read
       | the assembly code for say a AAA videogame and try to figure out
       | if it's a FPS or RPG game, but if the intent of a program is to
       | do a small thing in a super-architecture-specific way, probably
       | assembly is a great choice - exactly because some other human
       | will see _exactly_ what you mean.
       | 
       | If I have to work in a big complex codebase, it's great to use a
       | very structured language like java/rust/etc where all the many,
       | many pieces are (or at least can be) clearly named. I'll have no
       | idea which CPU registers are twiddled when, but I don't care, and
       | neither did the author of that code (presumably why they chose a
       | high-level language).
       | 
       | On the extreme end - a tool like excel which is AWESOME for
       | getting computations done and presenting the results, but is
       | (IMO) not the best for communicating _how_ to do those
       | computations. Do every single one of the cells in this column
       | have the same formula? If not why? Is that intentional?
       | 
       | I thing programming languages are awesome exactly because of the
       | extreme, explicit precision and repeatability that they allow us
       | to communicate with, but certainly not all problems [that are
       | currently solved with programming languages] require that kind of
       | rigor.
        
       | bcheung wrote:
       | I've had very similar thoughts and have wrote about them here. I
       | would be interested in discussing more.
       | 
       | https://github.com/brennancheung/wasmtalk
       | 
       | Some key takeaways from the above link:
       | 
       | - The programmer's tool should be a tool for manipulating an
       | annotated AST (not text)
       | 
       | - There should be many different types of UX's for different
       | scenarios, each maps to and from an AST in a UX that is optimal
       | for the developer for that scenario
       | 
       | - We must be conscious of human brain limitations and cognitive
       | psychology and work within those constraints
       | 
       | - "Reading" and "Writing" code should have different UX's because
       | they are radically different use cases
       | 
       | - Use RPN. It models the real world. Humans are designed to
       | manipulate their environment in an incremental manner seeing the
       | result each step of the way. When we have to plan out and write
       | code for an extended period of time, trying to play compiler in
       | our head, we overload our brain unnecessarily and highly likely
       | to make simple mistakes.
       | 
       | - Testing should be a first class citizen in the developer
       | experience and indeed baked into how we develop at a fundamental
       | level that it seems strange that they are even decoupled to begin
       | with.
        
       | 29athrowaway wrote:
       | My 2 cents: There are thousands of projects trapped into
       | formatting hell because nobody wants to touch git history. We
       | need a standard to fix formatting programming without messing up
       | history.
        
         | x1xx wrote:
         | To some extent this can be addressed with `--ignore-revs-file`:
         | https://www.git-scm.com/docs/git-blame#Documentation/git-bla...
         | 
         | An example: https://www.moxio.com/blog/43/ignoring-bulk-change-
         | commits-w...
        
         | joshlemer wrote:
         | Some code formatters such as Spotless
         | (https://github.com/diffplug/spotless/tree/main/plugin-
         | gradle...) allow you to format code only in files that have
         | changes against some designated branch such as `master`. So,
         | you check out your feature branch, make changes, do some
         | commits, and run spotless. Only the files which have some
         | changes between your workspace and the master branch will be
         | formatted. This allows you to gradually format the project as
         | and when files would be changed anyways.
        
         | LesZedCB wrote:
         | convert code to sexprs, diff the tree, track those changes not
         | the text on a 2d grid
        
       | akomtu wrote:
       | The #1 thing we need is a paradigm shift w.r.t complexity. We
       | know that complexity, as the number ofvthongs you need to keep in
       | mind to see the big picture, grows with the size of the project,
       | but that growth varies greatly. A bad programmer writes code in
       | such a way that complexity grows quadratically: it quickly
       | crosses the threshold of being understandable by anyone and then
       | the project is better to be redone. A decent programmer keeps the
       | complexity linear by separating it into pieces with clear
       | interfaces and behaviors. A great programmer can keep this growth
       | sublinear, logarithmic maybe, but it's an art - this is what
       | makes huge projects possible (linux, etc.) The paradigm shift
       | would be a formal way to enforce low complexity growth, so even
       | mediocre programmers can't f-k it up, similar to how syntax
       | correctness is enforced.
       | 
       | The #2 thing is documentation, which is in a very sad state right
       | now: everyone writes boatloads of unstructured text that vaguely
       | amd loosely explains something, and newcomers have to either
       | parse this mess, or ask those who know for a digestible summary.
       | This happens because text, the way we write it, poorly represents
       | our thought models. We've learned to split text into words, words
       | into paragraphs, and paragraphs into chapters, and we've even
       | invented content tables, but all that isn't enough to deal with
       | the enormous complexity of software we have today.
        
       | fleddr wrote:
       | I believe already some 2 decades ago Bill Gates said that the
       | biggest failure in software is the lack of productivity gains in
       | software development.
       | 
       | Just to cherry pick a dramatized example. In the late 90s, one of
       | my first programming experiences was in Delphi. It's a very
       | visual way to program. You drag and drop a UI together from
       | standardized elements. You could data bind things like input
       | fields to a data source. You'd double click a button and it takes
       | you to the already created "onclick" event where you do the
       | actual coding. In a way, this is still similar to how you can
       | "program" Microsoft Access today.
       | 
       | In this same period (I was in a computer science study) I was
       | moaning to my teacher how tricky programming in C was. I made
       | tiny memory management errors crashing the entire PC, with zero
       | debug output.
       | 
       | His words: "Don't worry. By the time you get to work, you'll just
       | do modeling".
       | 
       | Now I work on the web. It's been 30 years since Delphi and
       | instead of productivity gains, we've taken steps in the opposite
       | direction. There is no standardized UI library. JavaScript has no
       | standard library. There's no single unified architecture. There's
       | no standard tool chain. It's all very low level after which we
       | stitch together fragile semi-abstractions.
       | 
       | I know it's an imperfect comparison, but I hope it gets the point
       | across. It's all far too low level and fragile.
       | 
       | This doesn't just hurt productivity, also accessibility. It's
       | simply not beginner friendly.
        
         | trhway wrote:
         | >lack of productivity gains in software development.
         | 
         | while from pure dev POV i agree, writing loops hasn't change
         | much, the overall productivity of high-tech has leaped a lot -
         | for example these days huge clusters of machines are running
         | and reconfigured just by a few lines of code. Many AI tasks
         | weren't doable at all while these days language translation,
         | etc. is just a routine building blocks.
        
       | Myrmornis wrote:
       | I think that a programming breakthrough that we need is better
       | (graphical) formalisms for describing how software systems are
       | intended to work. We can do better than drawing boxes and arrows
       | with no clearly defined semantics. I don't mean formal models of
       | how a program actually does work (i.e. I'm not talking about
       | Petri Nets or CSP, although I'm not a computer scientist and
       | couldn't tell you much about those things): what I'm talking
       | about is a better language, or collection of visual formalisms,
       | for referring to the components that we really _mean_ when we
       | draw software designs using boxes and arrows. So something like
       | UML, but that actually helps describe application/system
       | function, rather than mind-numbingly documenting an OO codebase.
       | There wouldn't necessarily be any connection between this and
       | code (although you could perhaps imagine generating high-level
       | automated tests from a description of how the system should work)
       | -- the aim would simply be to have a more sophisticated way of
       | communicating about how we intend or hope that our designs will
       | work.
        
         | mayank wrote:
         | There's a hierarchical modeling paradigm/tools called C4 that
         | (while being boxes and lines) helps with the zoom-in/zoom-out
         | nature of understanding systems: https://c4model.com/
        
           | Myrmornis wrote:
           | Thanks, I have seen that but never really looked into it.
           | Have you found it useful?
        
       | the_af wrote:
       | Everytime someone proposes a non-textual representation of code I
       | cringe.
       | 
       | There's a reason no one single alternative has triumphed over
       | text. And many have been proposed!
       | 
       | Standards are hard. Proprietary tools lock you in. Text is
       | universal (OK, restricted to plain ASCII, which is a big deal but
       | has already happened). You can open and modify a text file with
       | whatever editor of your choice, the simplest possible editing
       | tool. Some weirdos (joking) even print source code.
       | 
       | That _reading_ , not modifying, is the primary operation to be
       | done on source code is an unchangeable fact of life. You won't be
       | able to change anything without inspecting it first, and no
       | representation is going to save you from that -- and it's
       | undesirable to wish for this, in fact.
        
         | Lichtso wrote:
         | Actually, I think we have already moved away from pure text a
         | long time ago. Think about it this way:
         | 
         | If "text" (so only the sequence of tokens) was the valuable
         | representation, then we would all program without any formating
         | (no additional spaces and linebreaks).
         | 
         | Now, you might say well formating is important for readability.
         | These spaces and line breaks do matter. But, just adding them
         | randomly where they are syntactically allowed is not helpful
         | either. There is some very specific structure to formating: The
         | AST.
         | 
         | So, in other words we usually structure short snippets of text
         | sequences in a graphical layout by ASCII-arting the structure
         | into it. And, even with that, many people would complain about
         | the missing syntax highlighting, another meta property that
         | pure text does not have ...
         | 
         | Anyway, I think you are right about almost all tooling being
         | build for text, so we are kind of stuck with it ("unchangeable
         | fact of life"). However, that does not mean that it is the
         | ultimate representation.
         | 
         | E.g. there is still one industrial nation stuck using the
         | imperial system, and that is certainly not because it is more
         | practical than the metric system. It is just that the
         | infrastructure, tooling and culture has internalized it.
        
           | UglyToad wrote:
           | I actually started writing a blog post along this theme but
           | never got very far with it.
           | 
           | I'm not against code storage and representation as text per-
           | se, merely that typing/editing it (text) is a not
           | particularly efficient way of thinking about code.
           | 
           | A lot of people I'd characterise as 'words-per-minute is
           | everything' style thinking are seeking the most efficient way
           | to convert thoughts into text input. From punch-tape to
           | mechanical keyboards the ultimate goal of programming
           | language development is a 'faster keyboard'.
           | 
           | I think this focus on text input as foundational is
           | incorrect. Most text isn't meaningful, the subset of
           | meaningful text is severely constrained by the execution
           | environment of the text. Outside of variable names and naming
           | functions text input just isn't that interesting or
           | important. For example unless you have previously declared
           | one, invoking a function named `ttoString` isn't useful.
           | 
           | This is why I think coding outside some form of IDE (how far
           | along that spectrum is up for debate, but I'd say
           | autocomplete at minimum) is somewhat inefficient. Code is
           | text, but it's also a layer on top of the text, the set of
           | possibilities defined both by the text and the
           | compiler/interpreter (or more specifically as you mention in
           | your comment, AST). Treating code as text where you might
           | rename a function with find-and-replace is frankly, daft and
           | backwards. Your tools should rename the
           | concept/symbol/whatever you're targetting specifically and
           | they should understand your intent and meaning. By focusing
           | monomaniacally on text we're ending up with worse tools.
           | 
           | This also scales to text input more generally. For some
           | reason spell-checking doesn't work for me in Firefox so I'll
           | have no doubt made a bunch of spelling mistakes in this post
           | and it feels a considerably worse way of typing. I don't
           | particularly value the ability to write "ocurence" since it's
           | incorrect. I'd rather have tools that assist me communicating
           | efficiently in a manner understoof (sic) by others. Text is
           | fine but tools are great.
           | 
           | This develops into a more general objection to languages like
           | Python/Ruby/JS but that's a whole other flamewar.
        
             | the_af wrote:
             | To be clear: I don't think about text and text input in
             | terms of _efficiency_. Well, that too -- almost every other
             | form of input feels clumsier to me, but that may be because
             | I 'm more used to text. But I think typing efficiency is a
             | red herring, a fetish of hackers who also worry about
             | mechanical keyboards and keyboard layouts and "you cannot
             | code unless you use three 4K monitors _at a minimum_ ".
             | That's a fetish -- time with code is spent thinking about
             | it, not typing words or even clicking with the mouse.
             | Still, many here will fight to the death to claim these are
             | very important things, even crucial; and I'll politely
             | disagree.
             | 
             | I think text reigns supreme because it's more universal,
             | less convoluted, and has zero vendor lock-in. If you want,
             | the tools to read and edit source code come with your
             | operating system!
             | 
             | There have been tons of musings, thoughts and even projects
             | to replace text representation of code. Where is their
             | widespread success?
             | 
             | I think text is the ultimate "worse is better", in the
             | positive sense of that concept.
        
               | UglyToad wrote:
               | Thanks for the response. I think we probably ultimately
               | agree. I was taking aim at that second group you outline
               | with my rant.
               | 
               | I had always assumed punch-tape was encoding some other
               | representation of code than text until I did the research
               | for my blog post. I think text is here to stay and I
               | don't have any real problems with that. Where my tools
               | offer designers or visual editors for code/UIs I still
               | prefer to use text.
               | 
               | As an on-ramp to programming nothing quite beat opening
               | up an HTML file in Notepad (or text editor of choice),
               | making some changes and seeing that your header now
               | flashed and was red.
               | 
               | I do think however that much like digging on a beach with
               | a plastic bucket and spade is fun when you are young and
               | carefree; when you're being paid to dig holes you want
               | the biggest shiniest JCB you can get.
               | 
               | I am mainly reacting to the second group who curl their
               | lips with disdain at the idea of doing anything other
               | than coding in Nano or whatever pure text environment.
               | They seem to see programming as a priestly sect dedicated
               | to text like Lindisfarne's monks and people who don't
               | know their Cherry Reds from Browns as fake/noob/impostor
               | programmers.
        
           | the_af wrote:
           | Thanks for the thoughtful reply.
           | 
           | I think what you call formatting is an essential part of
           | textual representation (alas! It's also the most contentious
           | part). After all, formatting is an essential part of how we
           | write and read novels, articles, etc.
           | 
           | In this sense, I think text with formatting _is_ pure text...
           | for human consumption.
           | 
           | I am arguing it is the ultimate representation: for
           | historical reasons, of course, but also because there is less
           | friction with tooling, less vendor lock in, fewer standards
           | that must be developed and adopted universally, etc.
        
         | mikewarot wrote:
         | >Standards are hard. Proprietary tools lock you in. Text is
         | universal (OK, restricted to plain ASCII, which is a big deal
         | but has already happened). You can open and modify a text file
         | with whatever editor of your choice, the simplest possible
         | editing tool. Some weirdos (joking) even print source code.
         | 
         | Ideas are impossible to specify precisely, which is why we use
         | words, with all their myriad definitions. However, if you apply
         | enough computing power, you can autoencode your way to a
         | compact expression of ideas as a 384 dimensional vector (like
         | Word2Vec), that is non-standard, but exact for that particular
         | model, with those particular weights. You can then repeat the
         | process in multiple languages, and with parallel texts,
         | language translation becomes something that can be automated.
         | 
         | The abstract syntax tree doesn't have to be something that can
         | be shared to be a very powerful tool. It certainly doesn't have
         | to be standardized. Just as there's no rational choices made in
         | the 384 dimensions generated by word2vec, there doesn't have to
         | be anything other than a binary format the tool can load and
         | save, in order to work.
         | 
         | If you can ingest multiple languages, and regenerate them as
         | output, translation between programming languages becomes
         | almost trivial.
        
           | the_af wrote:
           | Thanks for your reply!
           | 
           | I'm not sure if this is what you're saying, but I think the
           | AST is not meant for "human" consumption (so it'd be outside
           | the scope of this debate, I think), but also, translations
           | that result in alternative and _radically_ different
           | representations between what you see and what I see can be
           | problematic.
           | 
           | "I don't understand your program, it's hard to follow."
           | 
           | "What do you mean? The yellow and black colors alternate
           | quite nicely."
           | 
           | "Colors? What do you mean? I only see triangles arranged in a
           | jarring manner, and they are hard to navigate."
           | 
           | "Navigate? Everything fits in a single board of yellow and
           | black colors, no need to navigate anything."
           | 
           | Etc.
        
             | mikewarot wrote:
             | >I'm not sure if this is what you're saying, but I think
             | the AST is not meant for "human" consumption, but also,
             | translations that result in alternative and radically
             | different representations between what you see and what I
             | see can be problematic.
             | 
             | File systems aren't meant for human consumption either,
             | they're a practical solution to the need to store various
             | bits of data on a disk in a coherent manner. We've made
             | tools for representing the inodes and other structures in
             | human readable form. We also represent them visually.
             | 
             | We can do the same for the AST. It doesn't have to be a
             | dump of the structure, a tool just has to present a view
             | that is close enough for our brains to impedance match, and
             | we're off to the races.
        
               | the_af wrote:
               | Isn't a text file representation -- what you and I see
               | when we open a text editor -- _already_ an abstraction
               | for human consumption? They are not filesystem-level
               | storage.
               | 
               | You can view an AST, but this is never going to supplant
               | a textual representation of code as a _lingua franca_
               | between you and me. A tool that represents ASTs is always
               | going to be a boundary between you and me (and also, a
               | more complex tool than a simple text editor).
        
         | unixbane wrote:
         | Standard boomer rant.
         | 
         | > There's a reason why the status quo exists
         | 
         | Yes, it's called the status quo.
         | 
         | > text is universal
         | 
         | Which one, ASCII, code page 9000, or UTF-8? Are you saying just
         | restrict to ASCII? Then we need custom solutions every time
         | someone wants to talk a different language.
         | 
         | > lock in
         | 
         | I am locked into using retarded insecure terminal emulators
         | because all my tools depend on it to render what you people
         | call "text" which is supposdedely "simple" or "universal". Even
         | vim breaks from unicode already. The primitive language of the
         | OS should not be some poorly defined idea of "text", but
         | algebraic data types.
         | 
         | > reading important
         | 
         | Which is better done by graphics that text. Just the fact that
         | with a structural editor - an if statement spans the amount it
         | appears to span, instead of having to trust someone to format
         | it correctly - is already enough reason to ditch text.
        
           | the_af wrote:
           | > _Standard boomer rant._
           | 
           | Please stay polite. I'm not a boomer and my comment wasn't a
           | rant.
           | 
           | > _Yes, it 's called the status quo._
           | 
           | I didn't mention the "status quo", please don't misquote me
           | in order to make a clever retort.
           | 
           | > _Which one, ASCII [...]_
           | 
           | I preemptively mentioned which one, which defuses the rest of
           | your sentence. More importantly, _you know which one I
           | meant_. And I know you know, so please, let 's not argue
           | this.
           | 
           | > _I am locked into using retarded insecure terminal
           | emulators [...] Even vim breaks from unicode already_
           | 
           | None of this has much to do with what I wrote. Again, I must
           | ask you to stay polite and on topic. If you dislike your
           | tools, use better ones.
           | 
           | > _The primitive language of the OS should not be some poorly
           | defined idea of "text", but algebraic data types._
           | 
           | This discussion is about representations meant to be
           | universally understandable by programmers, i.e. humans, not
           | by the OS.
           | 
           | > _[reading] is better done by graphics that text_
           | 
           | Reading is _mostly_ done using a special kind of  "graphics"
           | called "text". People with disabilities or who are busy doing
           | something else, like driving a car, choose alternatives; but
           | let's be honest, most people read text.
        
         | 6510 wrote:
         | But how do we know which part of our preference for the querty
         | keyboard is it's efficiency and which part is not wanting to
         | learn?
         | 
         | If I think of non textual rep I'm getting a picture of someone
         | trying to strike a pinata with a blind fold on where the
         | someone is me.
        
           | the_af wrote:
           | Good question!
           | 
           | I think there's always going to be friction for old
           | programmers used to their ways, but why then aren't _new_
           | programmers more successful with their pinata alternatives to
           | text? ;)
           | 
           | Alternatives have been proposed and they haven't caught on so
           | far (for general usage, I'm not talking about specialized
           | applications where they make sense).
        
       | richardfey wrote:
       | I disagree whole heartedly with everything written in this
       | post..whoah. I am almost thinking this was written as a sort of
       | provocative summary of what are *not* the software problems to
       | solve.
        
       | sshb wrote:
       | Agree with most of the points in the article. I've tried to
       | attack this party by generating code and leaving all other
       | maintenance to developer without any framework constraints:
       | https://github.com/sashabaranov/pike
        
       | aappleby wrote:
       | Plaintext is a serialization format for source code.
        
       | jesperlang wrote:
       | There is a lot of interesting work on program as non-text/model
       | at Unison:
       | 
       | https://www.unison-lang.org/learn/the-big-idea/#richer-codeb...
       | 
       | Until these ideas go into mainstream, treesitter has resulted in
       | some interesting improvements to e.g Neovim. I use it extensively
       | for AST based selection/navigation and along with conceal I can
       | hide/transform a lot of noise characters in text source code.
        
       | ChrisMarshallNY wrote:
       | I liked the section on testing[0].
       | 
       | I tend to write _far_ more testing code, than the CuT, itself.
       | Many of my various widgets have test harnesses that are, in and
       | of themselves, full-fat, App Store-ready apps.
       | 
       | I find test harnesses are generally better (for me), than unit
       | tests[1].
       | 
       | I was just thinking about this, this morning.
       | 
       | I'm what people refer to as a "crusty oldtimer." I wrote my first
       | program (Machine Code) in 1983, so I've seen some changes in the
       | landscape.
       | 
       | These days, the general posture of many shops seems to be "Our
       | programmers suck, and can't be trusted to write code gut." Sadly,
       | this is not necessarily an inaccurate stance.
       | 
       | It tends to result in _highly_ defensive IT infrastructure and
       | process, though, with heavy reliance on languages and strict,
       | rote methodologies.
       | 
       | I used to write a lot of code in C++. Nowadays, people seem to
       | freak out, at the thought of writing in C++. It's entirely
       | possible to write safe, performant code, in C++, but _it isn 't
       | enforced by the language_. The same for PHP, which I've used a
       | lot.
       | 
       | It's also quite possible for bad programmers to write truly
       | nightmarish code in both languages. I know of which I speak,
       | having written quite a bit of said "nightmarish" code. That's one
       | of the reasons I write fairly good code, these days.
       | 
       | The conventional wisdom seems to be that we need to rely on the
       | tools (languages, IDEs, VCS, CI/D, etc.), to assure good code.
       | 
       | That's fine, but it seems to stem from an unwillingness to invest
       | in the most expensive component in a cubicle; the software
       | engineer.
       | 
       | This is a long, tiresome discussion, with no one willing to
       | change their minds, so I'm not going to follow up on it.
       | 
       | I did notice that this posture seemed to start in the mid-1990s.
       | Before that, companies put ridiculous amounts of trust and
       | investment in us.
       | 
       | [0] https://yoyo-code.com/programming-breakthroughs-we-
       | need/#tes...
       | 
       | [1] https://littlegreenviper.com/miscellany/testing-harness-
       | vs-u...
        
       | Aqueous wrote:
       | I've thought about this issue so very many times, and I feel that
       | until someone creates a system capable of understanding the
       | underlying purpose of the code, we will not be able to automate
       | this stuff away. I think the issue is that all of the things the
       | author wants a breakthrough for is exactly what makes programming
       | hard. We don't have systems intelligent enough to reason about a
       | contract between two systems so as to create a general-purpose
       | solution for things like glue code. The subtle differences that
       | are there and that require us to do this work over and over again
       | with small variations are precisely why programming requires
       | intelligence.
        
         | 082349872349872 wrote:
         | Part of the "structured programming" revolution was that the
         | compilers said "any color you want, as long as it's black":
         | they were general-purpose glue code generators by declaring
         | everything to use the standard contract.
         | 
         | (later, optimizing, compilers would spend a lot of effort to
         | reason about different contracts, and in recent times,
         | "undefined behavior" would come to surprise people who were
         | used to the rather laxer approach to contracts in earlier days,
         | but these are epicycles.)
         | 
         | There will always be work doing things over and over again with
         | small variations, but I for one am glad to no longer be making
         | variations on decisions like "will this parameter be coming in
         | a register (which?) or on the stack (and if so, with what
         | alignment)?"
        
         | w10-1 wrote:
         | Charles Simyoni's Intentional Software attempted systems
         | "capable of understanding the underlying purpose" targeted at
         | both programmers and business people. It was (hidden)
         | parameterization all the way down. They invested several
         | engineer decades and got no where. Microsoft bought them out
         | for their patents.
        
         | commandlinefan wrote:
         | > we will not be able to automate this stuff away
         | 
         | We can't even automate _testing_ of code (no matter how much
         | "test automation" you have, you have manual testers too).
         | That's orders of magnitude easier than automating the
         | _creation_ of the code in the first place.
        
       | danschumann wrote:
       | The future of programming probably resembles the holodeck on Star
       | Trek, or minecraft redstone.
        
       | unmasked_poker wrote:
       | I solved this for me with a custom visual studio extension. It
       | allows me to quickly specify a pattern that will create new code
       | or change existing. The extension will show a so called Code Lens
       | for each possibility to apply the pattern. This way for all the
       | tasks I find my self doing over and over again I design the
       | pattern as some kind of master and then apply it again and again
       | on hundreds of locations in many projects. (some things I have
       | solved this way: prisma schema, GraphQL resolvers, frontend code
       | matching my backend API including full typings, ...). Saves me
       | tons of work but I still have 100% controll over the code.
        
       | nathias wrote:
       | I think the breakthroughs we need is to program something else
       | than just ad-serving machines.
        
       ___________________________________________________________________
       (page generated 2022-08-17 23:00 UTC)