Ask HN: What big programming productivity gains you see happening in 5-10 yrs?

101 points by pritambarhate ↗ HN
If we look at the current programming languages & frameworks, there is a trend away from dynamically typed languages and monolithic high productivity frameworks like Rails. Considering new famous languages, Go, Rust, Kotlin, Swift, Nim & Crystal, main focus seems to be on static typing & AOT compilation to improve performance. There is a definite push towards adopting functional paradigm mixed with OO, which seems to be a push towards improving accuracy and parallelism. However, there is little groundbreaking in order to increase programmer productivity by a huge margin. (Not discounting the memory safety and other improvements, but they seem incremental.)

On the other side, there is a definite shift towards "backendless" applications, where frontend talks directly to the DB, either via autogenerated ReST or GraphQL APIs or via proprietary tools like Cloud Firestore. This is good for MVPs.

Frameworks like React & Angular give you decent building blocks to create SPAs, but the learning curve & effort required to create ambitious applications is very high.

There is a proliferation of "Low Code" frameworks which allow you to design drag & drop UIs & connect them with APIs. But, it feels like going back to "RAD" tools for the late 90s which led to a lot of spaghetti code. Also, some of these are prohibitively expensive.

One noteworthy change is UI design products which are trying to produce the code from UI Mockups. Relatively primitive at this stage. A breakthrough here can definitely be a big productivity booster.

Another productivity booster is Cross-Platform frameworks. It's already here, tried & tested. We know the trade-offs well. It requires a huge amount of effort to create & maintain a cross-platform framework. Big companies are already tackling this.

Considering this background, what do you think will be a breakthrough innovation in programming which will enable programmers to deliver ambitious web/mobile apps at a very high speed.

105 comments

[ 48.8 ms ] story [ 2946 ms ] thread
AI powered intellisense and code generation.
TabNine is the all-language autocompleter. It uses machine learning to provide responsive, reliable, and relevant suggestions.
- Context-aware IDEs with significantly more powerful versions of today's intellisense tools.

- Compilers with even more powerful implicit behavior- forget automatically creating Get() and Set(), we'll be creating entire inheritance structures with one function definition.

> we'll be creating entire inheritance structures with one function definition.

Hooray, it's just what I always wanted. A deep nested inheritance chain that not even the original implementer really knows well.

Seconded and I'd even like to extend it to say that we'll be moving closer to automatically written code via machine learning.

So we'll see a shift away from "developer specific boilerplate" in the same way libraries have abstracted a lot of basic setup boilerplate.

You'll say "initialize a web service with these models" and the IDE will build out the majority of the project.

As long as the built parts are source code which follows human-readable formatting standards, so developers can fine-tune from the prototype, I agree.
Have you used Haskell? It can automatically generate a lot of things for you if you allow it. Sometimes I really find it amazing.
AWS has lots of tools which have made me feel like a super developer. For example, using Lambdas and S3 to build massively parallel processing systems in just a few days.
Continued increase in network speeds.
Maybe the software industry will discover constraint programming the way that it discovered functional programming over the past decade. If it did, that would almost immediately increase programmer productivity for non-performance-critical tasks (since the compiler could supply the implementation), while making formal methods more easily applicable to production code & supplying the prerequisites for more clever automatic code generation methods.

(In general, software engineers becoming vaguely aware of tech invented in the 1960s and 1970s is a huge productivity boon. If you, as a developer, want to impress your peers, you should take a couple hours to read what software engineers thought was obvious prior to 1980, when software engineers had a strong background in software engineering.)

Any suggestions for sources on what was obvious prior to 1980? Happy to spend hours reading... but hours searching + reading adds up rapidly in a time-scarce environment.
An infinite loop of software trends :-)

To answer parent, I actually think better understanding of personality types and how manage people better will come with far better productivity.

The jungle of technology alternatives of how to solve business problems, causes a lot of unnecessary fights. It doesn't matter if you choose React, Angular or Vanilla JS. If your team is fighting each other, your team is not productive.

With this in mind, don't hire people that always agree with you, you always need someone to challenge you.

I think you've hit the nail on the head. The magic bullets are human factors from the interpersonal domain.
These approaches did not fall out of favor because programmers were so much smarter, as you are implying. They fell out of favor because they were impractical at the time. Eaither because there was no language with critical odoption, the computers were not fast enough. The solutions had problems that the designers just assumed would be solved later, or the concepts did not survive their impact with reality.
As someone who has used (and suffered at the hands of) NSLayoutConstraint, I'd actually love to see a more accessible and generally understandable version of this come into existence. Constraint programming is an underrated area of research at the moment, and I think it can be made so much more powerful by using what we've learned from building functional and declarative languages over the last decade.
> you should take a couple hours to read what software engineers thought was obvious prior to 1980

If you care about the subject this much and you think that everything was better before the 80s, then why don't you link to or name some sources you value?

Time is a flat circle.

The industry oscillates. Each oscillation is a mirage that presents itself as a productivity gain but is in actuality an echo of the past.

Are the techniques we use today really more productive?

Javascript performance on mobile continues to get better every year.

For many of the informational based apps, it's totally overkill to create a native experience. One app, responsive views, and your small team is suddenly incredibly productive.

Disappearing middle layers:

The OP mentions "backendless applications", and using Javascript and the browser as your platform feels like the same kind of trend.

Sure, all those layers are still there — OS, TCP/IP, raster — but we've settled on a standard simplified foundation that's good enough and that everybody implements, whether it's Safari-iOS-touchscreen-ARM-LTE or Edge-Windows-mouse-x86-Ethernet.

"Static web applications" likewise — maybe instead of your own backend you call a few SAAS's that you've configured in a GUI rather than written code for. The point is you've reduced the number of layers you have to maintain, while still targeting a huge number of users.

In general, the trick is settling on a foundation. The web has evolved rather than being handed down from on high. What consensus will the next 5-10 years of evolution bring? Or will new platforms appear? Will Fuchsia show up and look a lot like the web?

Maybe the quality of that foundation can be measured by programmer productivity. A web standard that's consistent from device to device is a boon to the whole world. Thank you MDN for telling me what works, and where! https://developer.mozilla.org/en-US/

Native apps have benefits other than performance…
WebAssembly as the prevailing cross-platform VM and used as the main distribution mechanism for most applications.
This would really be fascinating to witness. I hadn't considered that anything would knock the JVM off of it's throne, but that has potential to happen.
We're gonna need a lot of quality abstractions between now and then and pray we don't end in feature-flag fragmentation hell where those applications end up with specific, non-cross-platform requirements.
I'm picturing a situation like the old Java app that handles remote console on some HP ILOs where you have to have a certain version of Java installed using a certain browser with a whole bunch of security exceptions manually entered. I know it's being planned specifically to avoid these situations, but that was the goal of Java, too!
40 hour max work weeks enforced and 4 day work weeks. Shifts for people that need to monitor ops.

Offices for everyone on staff that like to work in a quiet place and pubic areas for people who like to work in those places .

Also, the minimization of time spent in meetings .

(comment deleted)
Was funny seeing the BBC article on "Office Space" yesterday talk about the switch to open offices without mentioning the backlash. Was sure HN would be up in arms.
> Also, the minimization of time spent in meetings

I would argue that this should be "the minimization of unstructured/unguided/unclear meetings".

Tbh I've seen a non-trivial number of instances where engineers have wasted their own time or someone else's by not participating in organizational meetings - either by doing redundant work or having an unclear image of priorities/blockers/help needed.

Nobody want's to waste time in meetings, and most people who call meetings can't run them well. BUT having a well planned and executed meeting (30 mins tops) can save hours if not tens of hours of work time per week.

I also believe that the "just let the devs do dev work and avoid meetings" mantra is border-line meme status and (in my opinion) stems from toxic anti-social behavior, rather than efficiency. However, I also believe that meeting time per week should have an upper-bound (something like 4-6 hours, including a 15-min daily standup) to better enforce efficiency, rather than throwing 1-hour meetings all over the place and hoping they don't use all the time.

Genetically engineered Chinese super-programmers who don't need to sleep and don't feel pain.
I read this and had to check my browser tab to confirm I wasn't on the main page and this was an article title.
The cycle repeats over and over. Monolith becomes unmanageable and get chopped into loosely coupled, functionally independent replaceables: mainframes to containers, application servers to micro services, etc. Drag and drop coding hits the wall and gets overrun by old languages: 4GL to C++/Java, HyperCard to Objective C, etc. The monoliths are currently numerous in the single page application realm, choose your framework. Eventually these will succumb to smaller more flexible and purposeful components.
Scattered smaller components aren't really any more manageable. Its basically the same but with a load of network calls in the middle.
(comment deleted)
Yes. Endless story. What I see in many of my clients projects (I'm a freelancer, 23+ years in IT) is a return to some kind of "monolith" applications.

They surfed on the "everything must be Google-scalable..." trends. They built hundreds of interconnected micro/nano-services, upgraded networking infrastructure ($$), OAuth federation, ...

What they've got? Network latency/congestion/..., security and API versionning management nightmare, unresponsive applications (tooooo manyyyy APIs calls), performance issues, circuit-breaker, caching, ... Ok you see the big picture.

Now, the returned back to a more "monolith" design. They merged many services together in one application (services that wasn't called by anything else). Everything doesn't need to be exposed as a service. This simplified security management, reduce a lot the network usage and simplified bugs investigation/fix.

The difference is that now, their new monolith designs are more modularized than before. Everything is now in a clear module (call it jar file, lib, package, ...) with a clear contract/interface. This is what I like to call "intra-services" : clear services/features separation minus the networking/security moving parts (and all band-aid solutions to support it like circuit-breakers, distributed caches, ...).

If one day you are the size of Google, Netflix, Facebook, Spotify, ... you will probably have the money/manpower to implement it the "Google way". Until then, KISS!

Note: English is not my first language.

Your English is very good considering.
The cost of using and teaching formal methods will continue to come down and program synthesis will become the practical means of automating a lot of lower-level code.
> Considering this background, what do you think will be a breakthrough innovation in programming which will enable programmers to deliver ambitious web/mobile apps at a very high speed.

Quality, Speed, Price. Pick two.

What is the driving force to "...deliver ... at a very high speed?" It's easy to assume that from the list above quality would be the one to suffer. Doesn't anyone here on HN ever get tired of being everyone's beta bitch?

Some other reinvented wheel that makes one thing 10x easier but takes five years to build up an infrastructure from scratch for everything else that real programs need (an infrastructure that was already present in whatever the new thing replaced). Let a bit more time pass to forget a few other things, rinse and repeat. In other words, no net productivity gains, just churn.
Came here to say this, but I'm not quite that cynical. No revolutionary change, but there will be incremental improvement. (On the other hand, we're going to keep tackling harder things, so the net gain in the rate programs are produced will be zero or negative.)

I also like the point that the "revolution" is in one aspect, not the whole thing, and it requires changing other aspects, and is therefore much less of a net win than it appears...

Kubernetes and other container systems are so widely adopted and accepted that most common system services are solved and require only minutes to integrate. As a result people move back to their monoliths because it is easy and productive
As languages with more interesting type systems come along, more powerful IDE tooling will be possible (e.g. idris 2/blodwen code completion https://twitter.com/edwinbrady/status/1050528305743622147)

More hopefully, maybe new language developers will put more work into easier and easier FFIs? How often have you thought "I wish language X could catch on, but all the useful libraries are in language Y?"

I think people will see that type safety and functional programming don’t impact productivity much in a business setting, and we’ll see a flight from these languages as examples of horrible legacy code reveal themselves to show that the problem is behavioral / sociological, and has nothing to do at all with enforcement on the code or compilation vs testing.

I also think more job candidates will reject interviews that waste time with unrealistic homework assignments, marathon on-site interviews, etc.

Finally, I think productivity losses and health issues related to open-plan offices will soar, but companies will continue to be disingenuous and act like it improves collaboration or saves money when it’s uncotroversially flat false.

The gains from every developer having really good go-to-definition and find-references for all languages and code bases would be immense. The Language Server Protocol (LSP) from Microsoft has standardized a way for languages to provide these features, and more and more editor and language implementations are being built.
> Frameworks like React & Angular give you decent building blocks to create SPAs, but the learning curve & effort required to create ambitious applications is very high.

Any ambitious application is going to require a high learning curve and lots of effort. Otherwise it wouldn't be ambitious.

TypeScript revolutionized the act of writing JavaScript

React and JSX revolutionized the act of writing HTML

GraphQL revolutionized the act of connecting front end and back end

But for CSS... SASS, SCSS, LESS, and such are by comparison pretty pedestrian tweaks on vanilla CSS

I think that CSS-in-JS is the new jam, especially if you're utilizing a state-driven UI view layer like React or Vue.
Right, but with CSS-in-JS I'm still fundamentally dealing with all the complexity and subtleties of raw CSS, just with better access to variables and such. Bootstrap is a much more disruptive rethink of CSS (ditto flexbox), but they only disrupt a small portion of the CSS surface area.
I think React is an interesting thing to think about here. There was a bunch of libraries that got ever-more-fancy about doing DOM manipulation. Those libraries helped manage the complexity of the model of doing in-place DOM manipulation. React chose something different – much more like the templates of yore – and instead of managing the complexity it introduced a simpler model that eliminated the complexity. That made it really different.

SASS/etc help manage the complexity of CSS, but they don't simplify anything at all. I think there's a scope problem here: the styling and layout of an application isn't just a bunch of selectors and styles in CSS. It's the class names and structure in the code, it's the implied connections between the expected rendered layout, it's a private language of expected elements and their semantics. You can't simplify that just using CSS. We're still waiting on someone to come up with a combined approach that actually works. I personally eagerly await someone's genius idea!

> TypeScript revolutionized the act of writing JavaScript

I agree with this point.

> React and JSX revolutionized the act of writing HTML

I see nothing revolutionary in React.

> GraphQL revolutionized the act of connecting front end and back end

OData existed before GraphQL and still does.

> Another productivity booster is Cross-Platform frameworks.

I would be so, so happy to see a UI framework that runs (well) on Windows, Mac, Linux, Android, and iOS. My druthers would be for it to have bondings to a JVM language (Kotlin is my happy place these days), but I would be okay writing in any similarly productive language.

Flutter is trying to get there, but it's not a viable solution on the desktop yet, and somehow doesn't even have a decent HTML widget. I do like Dart, however; it's similar enough to Kotlin/Swift that I'm comfortable writing it, even if I have to look up exact syntax now and then.

Electron wants to solve this problem, but we all know the arguments about its bloated runtime and egg-cooking power usage.

I suppose Progressive Web Apps and WebAssembly have the potential to solve this, too.

Qt mostly does this, if you count modern C++ as a productive language.
Why not QT? I'm pretty sure it works well on most if not all platforms and has bindings for every language.
(Serious question) Isn't this what Java UI frameworks (swing/javafx/etc) are supposed to address? It's been a while since I've been in the JVM universe so I'm genuinely curious.

Also, what about Xamarin/C#? Going from Kotlin to C# should be pretty smooth and Xamarin is supposed to be pretty usable.

Yes, and I've done a lot of GUI work in Swing. The main issue is that Swing doesn't run on Android and iOS.
What about Tornado FX?

I use Kotlin mutli platform. Share the scss between react(KotlinJS) and Desktop(tornado).

I'm on the PWA + WebAssembly train now as a solution for this. I really think we're finally getting close to a world where desktop-apps become truly pointless with Wasm + PWAs, and the WebGPU spec.
This. WebAssembly is in a unique position to be tackling this problem since modern web browsers already have sandboxed OS level access to cameras, microphones, desktop, bluetooth and hopefully GPUs.

The future of running Autodesk, Adobe software and AAA grade games on the web is coming nearer with WASM.

People have been banging on about cross platform frameworks for years now. They are all too much of a compromise. It probably won't get any better than what we have now.
The Flutter dev team are currently conducting a survey and a couple questions were regarding desktop mode so I reckon Hummingbird is coming pretty soon.
The pendulum is now swinging back to types. Because it's a pendulum, in 5-10 years the next hot productivity thing is going to be dynamic, type-free languages.

I still remember when people were excited by the productivity gains from Ruby. "No time wasted wrestling with casts and typing".

Rather than a pendulum, I think the reality is that typed languages are now going through a significant period of evolution, especially with the advent of _gradual_ typing. TypeScript, for example, is just a superset of JavaScript, but with a compiler that's smart enough to infer many of the underlying types from context. The notion of rigorous, strong typing has always been marred by the concept of casting, but this is practically nonexistent in a gradually typed languages. Do you get the same degree of rigor? Perhaps not, but you do benefit from some of the guarantees made by the compiler.

The underlying trend here is toward more pragmatic language design, and I think this is definitely a trend that will continue in the near future (5-10 years).

Agreed. It seems typed languages are adding a lot of features that made dynamic languages interesting. You can see the same in databases where SQL engines are adding features from NoSQL.

Overall I feel there is much more language development going on now compared to may 2000-2010. I am not a big fan of JavaScript but I feel its rise has put pressure on other languages to keep up.

(comment deleted)
> what do you think will be a breakthrough innovation in programming which will enable programmers to deliver ambitious web/mobile apps at a very high speed

I'm not sure that speed-to-market will be where the breakthroughs are. But constraining myself to that conditional...

The best one I can think of is a library of curated, easily embeddable snippets. Like Helm charts for code. We already have package managers, but as the industry grows more and more with a larger number (not necessarily percentage) of developers churning out sub-par code, companies are going to want to leverage reuse sans fear. You already see this curation with some languages/ecosystems having sets of blessed libraries, but a library is too high of an abstraction and it is language specific. Some group one day will offer embeddable, curated snippets (or entire libraries) that follow a certain set of rules to give confidence to their users and they will apply those rules (with language specifics) across runtimes. In both good and bad ways, some systems may end up being a walled garden of code where they only accept this curated code which, as walled gardens can be, are good for the users (i.e. devs referencing the code) and bad for the devs (i.e. devs writing new components being forced into others' rules).

Would you feel better with a "Guaranteed by StringentCodeTrust(tm)" seal on a library/repository you reference? A non-pragmatic middle manager at Big Corp might.

Search, i.e. lower activation threshold for accessing intelligence from strangers elsewhere in the world.
I think just finally getting rid of unsafe languages, particularly at the bottom. This will I think increase "productivity" of the world at large, by reducing the number of crashes and security holes they have to contend with every day.

I feel like we have finally arrived at the time when more people accept no-one (or at least, no-one outside a tiny set of people) should be using languages with undefined behaviour, or unsafe memory accesses by default (looking at you C and C++).

If "we" want to be taken seriously, and as more of the world relies on computing, we can't be building on a foundation of sand and saying "Oh, as well as every programmer is clever enough, all the time, we'll probably be OK".

I think C and C++ have too much buy-in from too many people to be replaced anytime soon.
I agree, but I think things are moving. Increasingly few projects are started in C and C++, and people are making serious efforts to convert som existing projects to (for example) Rust.

Also, looking at things like the Linux kernel, they are moving to add as many safety checks to C as is reasonable. Clang is adding a "all stack variables are initialised" mode.

But then the next generation of languages needs to make sure that you can actually do what you need to do. With C/C++ I am pretty sure that whatever problem I have can be solved. It may be ugly but you can go very deep down to the last bit. So a safe language should allow you to do that if needed.
Rust is quite good for that. Also, you can always get a very clever person to write a very small piece of C code.

Or perhaps, we just need our programs to be 20% slower? Would you buy a house which was 20% cheaper, but if a plumber was having a bad day there is a significant chance your house will explode if you turn all the taps on at once?

It's not only about speed. I was more thinking about programming close to hardware. There you need all the tricks.