These days my main problem when learning is coming to terms with the development environment.
Python, how do I install and work with venvs? What is poetry and why is it better?
Scala, what is sbt and how do I make it work in Intellij?
Things I have learned under way, but still more of a headache than the actual language, since most ideas there are recognizable. And problems in the dev env can make you get stuck for several hours.
Docker helps a bit as an abstraction, but not all the way to the development environment.
Ad Scala - it depends if you already knew a JVM based language. If you are coming from Java you will have a head start: use Maven/Gradle instead of SBT, you will already know IJ, you will know your way around managing JVM versions and understand core concepts like jar files and class loading.
For me the most time intensive part of learning a new language is learning the new libraries. I don't mean here the standard library but rather things like library for interacting with SQL database, how mocking works in the new language, how concurrency works, web API framework.
Learning "just" a language can be done over the weekend. Learning to properly use its standard lib and the entire environment of libraries may take years.
The best way to learn a language is to build a project with it. Anything else is just exploring its feature. The trickier issues are always features integrations.
I couldn’t agree more. And once you have mastered or at least come to terms with the development environment, eventually you must learn how to deploy. That’s also a minefield.
I will confidently back you up. I am a well-rounded programmer, and have used many languages and domains. Kotlin (in the Android SDK at least) is the most complicated, messiest, least-pleasant I've found. JS/Node is second place.
I'm reasonably confident it's not the Kotlin language itself I dislike, so much as the tooling associated with it, and the expected project structure.
It’s a newcomer confusion vs old-timer habit. You’ll feel the same in C, python, etc if you never seen these. And vice versa in any direction.
Edit: But I absolutely agree that $subj platform should focus on that, not even on the language. A language can be learned in one evening on a “fiddle” site, no platform required.
Personally, when I become interested in another language, all I want is a page of common snippets or a cheatsheet to get the feel of syntax, and then how to make and deploy a non-toy project with all the usual libs and tools attached.
It’s a yet another facebook shaped opportunity though. The hardest part is not to collect and systematize information, but to become distinguishable from a mountain of shitty blogspam that google agrees to promote for financial reasons.
For meta, I’d say our issue here is not the lack of platforms or manuals, but that we simply don’t have a decent search engine, because we don’t have a decent internet economy model. Our models and tools are indecent and there’s no help.
Yes, if you're using the popular stacks of tools, frameworks and proprietary embellishments like Typescript.
If you're focused on vanilla JS development along with modern native browser tech like WebGL, WebGPU, WASM and Web Audio things are much more straightforward, the only tricky choices I guess are which 3D engine to use and what +1 language you want to take to the WASM party.
Second this. For any reasonably popular language you can ask for the variation of dev env boilerplate you specifically need, and also ask questions about it and why it’s setup that way. Specifically what certain configurations do and why. Getting this info through an LLM is so much better than doing it by google search or reading docs.
An experienced software engineer can learn new languages and syntax quickly. I would say the same for the core libraries for a given language. Learning the development environment, productionalization, deployment, and hosting can be daunting even for experienced architects.
Seniors have a language-independent model of software development tasks such as writing code, testing, debugging, building and publishing artifacts, etc. to work from. They can map that model more or less to any software ecosystem. That model comes from hands-on experience building software, and often takes years to build.
While they are building up that conceptual model of software development, an engineer is also building up knowledge about the _details_ of their first or primary language’s ecosystem, libraries, and tooling. This also takes years, one just doesn’t notice it with the first language because it intuitively feels like “learning programming” since it happens in parallel.
The result is that a senior engineer can be productive quickly in any language, relying mostly on their conceptual model. But to go from “productive” to “mastery” with a new ecosystem is still all the same time and effort it took for the first one.
Would love the equivalent of this but before applying practical problem solving. For instance in go you learn to leverage goroutines and channels. In another language it would be threads. Common design patterns etc. Gotcha’s of the language. In Python you use exception handling very commonly, in golang you’re using a special return value of an error type. JavaScript you’re using a ton of anonymous function closures. Async vs await.
I keep wanting to build this mega doc site to teach more than just “what are scalar types in this language” and more of how to apply it in idiomatic ways.
Devdocs is just a collection of official documentations. GP wants a collection of documentation that explains comparative, idiomatic problem solving in each language. How are they even remotely similar?
This is excellent. I checked Julia which is my main language and all essentials are there. Looked up to Zig, F#, Go all accessible expositions and makes it easy to get a good taste before looking into the manuals.
I would second this. I have pretty extensive experience in a few python-like languages, and had written a few hundred lines of python over the years, but had never had a full-time job writing it. I had an upcoming job working on a python codebase. I found ExecuteProgram to be a pretty great as a way to bone up on intermediate python syntax, idioms, and standard library so I could minimize the first few weeks of "How do I do [common thing I know in 5 other languages] in python?"
On a related note, I found going through "The Raytracer Challenge" helped me to re-familiarise with C++ (after 20 years). Note that the book isn't language-specific. Installing clangd (and getting it to work with my text editor) really helped too, to speed up the edit-fix loop. Perhaps going through a book like that is a good way to challenge yourself to learn enough of a language and its tools. The test-driven format of the book was good to make sure that my code is correct at every stage.
Any time I start using a new language I always start with "Hello world" and working a few simple example programs to get my head around the syntax, idioms, and common data structures. But yes, don't spend a ton of time on this, as soon as you have a sense that you know what to do, start tackling actual work.
If the languages are at all commonplace, having an AI convert a program from language X to language Y might speed you along as well. No guarantees it will be perfect but it will probably get you in the ballpark.
I try not to use AI when learning a new language. I don't want to rely on premade answers to my problem. I prefer using the language's documentation and some light SO searching so I can figure it out on my own. AI is the last resort for me when learning something new.
I’m going to go against the flow and say nothing. I think the primary reason you see seniors looking for senior focused platforms is because almost all the learning content is terrible. Seniors will spot this sooner than juniors. I’ve worked as an external examiner for CS students for a decade and the stuff they put themselves through to avoid reading official docs is amazing. They’ll literally sit through 50 hours of video of what is essentially two a4 pages of “example how-to”.
Why a senior wouldn’t just head directly to the documentation for a programming language or the equivalent to “The C++ Programming Language” is a different question though. Learning a new language is extremely easy, it’s learning how the compiler, runtime and so on which is hard. You’ll very rarely find that outside of official docs or books written by extremely knowledgeable people.
I 100% agree with your take and suspect most actual "seniors" do as well.
Eventually most seniors should come to the realization that expecting there to be a "senior" oriented platform is unrealistic for a variety of reasons (mostly, because the exercise based nature of platform learning in the beginner sense just isn't the sort of thing you need to learn to become senior level in a language and isn't super useful to seniors coming from other languages...).
A real senior that is really trying to learn a new language or ecosystem to a reasonable amount of competence should start with the docs and with a small (but sizeable, enough to have to learn the languages tooling and whatnot) project.
I shouldn't even comment on this, but if you expect there to be video tutorials for the kind of thing you are trying to learn, then maybe you have experienced some form of title inflation. Eventually, people need to learn to read the (f'ing) manual, and I hate to say it like that because it's infamously toxic when inappropriately told to beginners as advice, but it's the truth for somebody that calls themselves a senior.
That's how I've learned Python, so far. Between that and, writing my own code, and looking at other's code, Ive picked up quite a bit (not an expert but I think I'm doing OK).
The easy part is the language, the difficult part is learning to do things the Pythonic way.
Of course, I have to allow for the Dunning-Kreuger effect.
You sound well aware of the fact that being able to put out working python code doesn't necessarily mean you fully understand all of the best practices and idioms that the particular community uses, and that's okay. You are aware of your weakness.
If you were stuck in "tutorial hell" but thought you knew the language, then maybe that would be Dunning-Kreuger. Or if you were unaware of your not writing idiomatic code due to coming from a different language and being new.
I think the main issue with most documentation is that everything is treated equally, and often critical details get a passing mention, so it's helpful to have focused course material that can give some indication of priority and a heads up for the tricky parts.
The challenge with this, and I agree with you, is that I don’t think you’ll find many people capable of creating such a course being in the course creation business. I suspect almost no one would be interested in doing it. The only financial motivation would be to go the consultancy route like Uncle Bob, and I’m not sure who would have any sort of motivation to do it as a hobby project. You’d be more likely to find those people contributing to the actual programming language in some way.
As I see it the programming teaching industry, or whatever you might call it, is similar to other self-help industries where people who are good at marketing sell you empty calories. Even if you created an in dept course on something, you would probably have an issue distributing it in the vast ocean of courses.
“50 hours of video” seems especially true for cloud certificates. Figured maybe I should finally pick up an AWS cloud cert or two and realised that video courses tend to be 40-50 hours per certificate. If you’ve already worked with AWS, or any cloud provider really, a lot of that content looks tedious.
In the end I bought a “course” that’s 6 practice exams with high quality questions and explanations of each answer. For AWS it’s been a nice approach, so far anyway, because the docs are truly vast and I probably wouldn’t have thought to read the docs for Snowmobile, which I don’t use day to day.
All your reasoning is agreeable but I disagree with the foremost conclusion
> I’m going to go against the flow and say nothing.
Whether we're talking about the actual language or the surrounding tooling and ecosystem, very few language and ecosystem experiences are actually different. As a result you're often mapping needs that you already satisfied and can explicitly state to another language. Someone who has already learned their n-th language looks at learning very differently.
This also makes a seasoned learner vastly more capable of extracting value from a friend or colleague who is willing to steer the learning experience.
Well a senior developer would be assumed to share a certain common understanding of concepts and terms that a more junior developer might not. When teaching anything one of the most important parts is ta gauge your pupils and determine whether they need more or less information to keep the topic interesting while not making it impossible to follow along. Since written or otherwise pre-recorded teaching materials aren't afforded the luxury of interacting with their pupils they must choose ahead of time what level they are aimed at. And since a senior in any field would be able to follow along with materials meant for the junior, albeit at a slower and less interesting pace, but not the other way around they tend to err on the side of over-explanation. A platform for teaching senior developers would therefore allow a more engaging and time saving experience for those able to consume it.
The essence of being senior, I feel is "I have made the mistake you are about to make". This echoes in language learning. When I was learning Go I could easily pinpoint what language design decisions were made because of lessons learned from this language or that. (I do not want to suggest schismogenesis applies to programming languages but ... it kinda sorta does?) Teaching with this in mind needs a very different curriculum.
Also, basic exercises are boring because we did them ten thousand and one times already just with slightly different syntax.
Another programming language as reference. I can learn a new language really easily this way, but the first was really hard - it was so unlike anything i had ever done before.
“Writing Fortran in Lisp” should not be disregarded. There’s a lot of value of having hands on exposure and success with common, even if not idiomatic, concepts.
Ye Olde “write once, throw it away” concept. Using prior language knowledge can make the first steps much smaller as you learn not just the new language, but environment and tools.
This can give you a quick, solid foundation with which to leverage learning newer ideas and idioms of the new system.
I’d like to echo what others are saying about building stuff you want to exist in the language you want to learn. I learned Flutter/Dart largely by building BeatScratch (https://beatscratch.io), and Rust entirely (and parts of functional React) by building Jonline (https://jonline.io).
But secondly, if you can, get work or your career path to let you build something in a new language. A lot of learning new languages (both programming and human) comes from social reinforcement and riding social waves. Smaller companies are a lot better for this than bigtech.
I learned Ruby at a company I was hired as a Java dev for initially (that had lots of Ruby staff). I learned Go and my first bits of React when a Ruby company I worked for was acquired by a Go company. My current company hired me to work on an Elm frontend without me having written a line of Elm in my life.
As long as you know basic programming, the best way to learn a new language is to just jump into an existing project or start a new one from scratch. Classes and tutorials will get you nowhere.
Learning a new syntax takes a day or two, a week or two at the most. Having a site or product that helps you with that doesn't seem important, at least to me. The hard part about learning a new language is learning how to use it, not its syntax. Learning how to use it requires working with it, and for a long time, somewhere in the 3 to 10 year range to really become an expert. You can't learn experience quickly using any product or YouTube video.
My bet would be to write a small program using your target language. With ChatGPT this is extremely easy as you will get a list of recommended libraries to use. Try to choose an app that requires some serious coding e.g. creating an image board like 4chan is better than coding a tic-tac-toe.
My recommendation is that the learning app should:
- Interact with an SQL database
- Expose an HTTP endpoint (REST or GraphQL)
- Use a logging framework
- Use concurrency
- Use a unit testing framework and a few integration tests
- Build should be automated using GitHub actions
In my opinion that's the fastest way to learn a language or more broadly a platform (as every language now is a kind of platform with its own set of libraries, conventions, idioms and untold rules).
PS. My list is probably not good for a system language like Rust or C++, but should work for languages from Ruby & Python, though Java & C#, up to Go and Erlang.
My old boss gave me some good pointers: find Koans. Ruby Koans, Kotlin Koans, there's probably a Koan for your language. It'll help you wrap your head around the basics of the language, and sometimes they'll even help you set up the development environment, which some people have alluded to being difficult.
From there, it's just ... using it. Making lots and lots of mistakes.
I didn't start really learning Typescript until it was a very real obligation for me, and my style of programming and the reasons for it have definitely changed over the last year as a reflection.
Accept that this sort of change is going to happen and that it's natural and even a good thing. It's okay to be new at things again and to make mistakes :)
Honestly, if you're looking for practical experience, you can learn a lot just from having that language's linters/security/style cops up and running and building a toy app (with tests) in that environment. If you want high-level understanding, the tutorials are usually enough.
This is a bad question cause it comes off as judgmental and everything...
But what do you think you are getting out of a "platform" when it comes to learning a language?
I agree with keyle that you'll learn more working on a real project than doing a platform curriculum that is usually designed around beginners.
Just my personal hot take. I like exercise I suppose if that's the sort of thing you really think would be helpful.
The only reason I'm giving you this answer is cause you said explicitly "for senior devs". I don't really know any senior devs personally (that would admit to) using "platforms" or exercises to learn new languages. For me, I open up the docs and start writing a project, and I think that usually gets the job done learning a new language a bit faster.
Most platforms are way too beginner oriented, and you'll rarely get anything that requires more than a small amount of code...it's tough to learn a language very well until you have more than say 1000 lines and are seeing how the tooling and modules and whatnot really work on a realistic size of project...
Honestly, I find ChatGPT excellent for this. There are two basic things I usually ask it for:
1. First, I ask it to give me a conceptual overview, going through the main features of a language I know well and then asking for the equivalent in the new language. I also ask it for specifics/features in the new language that aren't present in the language I know well.
2. If I have specific questions, I'll write a code snippet in a language I know well and ask it to translate it to the other language. I might also ask it for "library equivalents", e.g. if there is some specific library that is the "standard" for doing something in one language, I'll ask what is the standard in the other language.
Related example: I suck at shell scripting because there is so much esoteric shit in it, so I used to just write short scripts in JavaScript and run them in Node because I'm so much more comfortable with JS and Node. Now, though, I'll just ask ChatGPT to write the script for me. The code isn't always 100% bug free, but I understand shell scripting well enough to usually fix any bugs. Also, if there is something I don't understand (e.g. ${VAR_NAME##*/} was a new one for me today), ChatGPT explains it well.
If you haven't tried it, I strongly recommend using ChatGPT (or Claude, etc.) for learning a new programming language.
Great website!
Edit: This also looks good, haven't tried it yet: https://app.codecrafters.io/catalog