I took the opportunity to rebuild my development machine from scratch this week. It has been accumulating tools, multiple frameworks and demo apps for years, had suffered through my dabblings in Hyper-V, SQL, C#/.Net, Python and now JS frameworks and had gotten quite polluted. Then Windows 10 Insider Build 18305 came along and broke my profile so I couldn't access the Start menu and that was the last straw. Time to gather my take-aways, abandon the cruft and apply those conclusions to a clean fresh dev environment.
What do I want to dabble in? Technologies that will help me build and actually complete these kinds of apps:
- Master-detail oriented record keeping applications that can be used for financials, capital planning and workflow, like SAP, Lucity and many other enterprise apps. Ideally, there's a common framework I can build that can integrate with arbitrary vendor databases, business rules in the middle tier and Web UI. The Lucity web UI is an example in this direction, though not well isolated from its data and possessed of a horrible UI.
- A wiki or blog like web site that can be used to organize and present technical information, engage with a community to continuously revise and extend it in a controllable way. Something that's easy to create content in, easy to find stuff in and can represent narratives and app-enabled diagrams which might be screen shots, code-and-output, maps, process control dashboards... So a wiki with some revision control rules, a Jupyter notebook with more engines, ArcGIS Portal, Ghost with Discuss on steroids.
This might be my first priority, I'd like to organize all the IT information I've accumulated at work and be able to hand it off in an easy to use and easy to maintain form.
I haven't given up on looking for an open-source project that I could just use. I'm flexible about the language and framework I might have to master. Trac was a near miss (I want to do more than code), DJango was an eye opener, though maybe not best starting place now, the various JS frameworks interesting but not clear to me how to leverage.
But the other way in is to choose a language and framework that I can master from the ground up and figure out how to integrate other projects as needed, and that's the point of this post: what is the sweet-spot for developing web applications now?
Although I want to build a very broad set of applications, I want to avoid "too" much platform lock-in. I go all the way back to "C", where the language was robust and reliable, but the major benefit was the run time library that provided standardized access to all the relevant computer and network resources regardless of the vendor platform. I yearn to find the same ability to abstract and compose abstractions on the web.
But the world has gotten much more specialized and diverse since 1970. kernigan and ritchie made many simplifying assumptions to deliver their total programming platform (e.g ignored IBM's multitude of file access methods and standardized on byte stream files, chose stack over linked call frames). I think it's fair to say no one human or team can really deliver a platform that comes with ready-to-use abstractions for all the services we want to use today. Instead, we have to find tools that let individual teams make their own abstractions in a task-specific way: very abstract for the stuff they just want to use; very specific for the stuff they want to build for themselves. So object modeling and coping with diversity of runtime platforms are the characteristics of tools that I want to be able to use to build the apps I want to play with.
To summarize where I think we're at, in my humble and not-fully-informed-on-the-details opinion...
Older platforms have a fairly constrained set of choices for these, but Web and especially the metastatisis of JS language features, frameworks and CLI tools does not. My goal is to make some choices in this proliferation that I can focus on and achieve end to end success with.
I'll mention it first, but maybe it should be decided last.
Object orientation, abstraction
I do want this, badly. I want to be able to modularize my solution, develop internal interfaces my app depends on, solve the tough problem by defining a language that makes the solution easy to express.
Web Assembly is very interesting, though bindings for C# or Python don't look mature yet. This is worth researching a bit, though.
So I'll take the dependency on an IDE, debugger and submit to the compile-and-go development methodology.
I can live with duck-typing like Python. I don't need static typing and certainly don't like the pomposity of some languages that insist on it (C++)
I need code modularity.
I want data object abstraction: I'm comfortable with constructors, getters and setters, where the language hooks into the object model for you.
Scheduling and parallism
I won't stoop to Promises – nice, try JS, but async/await is really better (if you don't have to retrofit and maintain a huge pile of legacy JS code). And I'm looking for a language where the Await is implied (based on the declaration of the function or method?). I could cope with blocking calls and thread synchronization, but I think the world has just moved on (for the better).
My runtime has to target Node and V8, but this is a (rapidly?) moving target. I see that Web Assembly is runnable in modern Node, too.
Wow, there are a lot of UI frameworks! I think they come from the evolution of DOM and JS, so each of them was good for a limited time and I don't know what's best now.
CSS and HTML 5 is fine. Maybe that will be the last really major change. V8 stabilizes the DOM. But I definitely want to encapsulate all this complexity into UI elements I can deal with, and ideally find some UI design tools to simplify the layout effort too.
I just want to lay out a few pages, create a few models for tables and forms that relate to database or API schema and let it go at that.
I want everything to be dynamic, updated on the fly as the data source changes. So React and especially Vue and Ember look good for this, but I don't know how polluted they are by their JS compatibility requirement (yet).
Tooling, or, developability
I really like Visual Studio Code IDE. It's got the breadth of language support and debugger integration for the environments I want to work in. There seems to be a rich library of add ons and community support.