13 ms·
The Hard Part of Learning a Language
- cachestash 6y agoHe should honesty consider using a different operating system one thing.
- sova 6y agoFrom the article, Do they think I’m subhuman scum for using Windows?
- qayxc 6y ago> He should honesty consider using a different operating system one thing. Why exactly? Cross-platform is pretty much dead if people start thinking that way. It's not just Windows either - I recently experienced the same sort of pain when trying to install a language on a Unix that wasn't MacOS or FreeBSD. So you'd think that at least the install script is Posix-compliant and runs on your shell? Think again! Despite it starting with an innocent #!/bin/sh , the script was actually bash-only and used GNU-extensions all over the place, too...
- moron4hire 6y agoYou must not work on anything remotely related to desktop gaming.
- maxeonyx 6y agoI skimmed this post and I agree with it. But I wouldn't want to actually read it.
- andai 6y agoMost of these would make a pretty good checklist (if phrased more positively).
- tiberius_p 6y agostory of my life
- unnouinceput 6y agoSo, a Python fanboy. Well, I remember when I learned Python 5 years ago, I did all of these. Before that I did them all with C# 14 years ago, and before that I did the same with Java, VB, PHP, C/C++, ASP, HTML etc etc(you insert any fad in past 20 years, I've done it) all the way back to 90's when I started with Pascal and Assembler. The general answer to all of them is "you grind and RTFM". I too am awaiting the time when all I need to be expert in a new technology is to just go buy the plugin I'll insert into my brain (hopefully we'll become cyborgs, that's my optimism) but until then is grind & RTFM.
- uryga 6y ago> So, a Python fanboy. the post literally starts with: > Python [...] is okay but has lots of frustrations. doesn't sound fanboyish...
- unnouinceput 6y agoAh sweet summer child, but that's exactly that. You see I prefer Delphi/Pascal to anything but if I would do a blog like OP, I'd lament all day how this is stupid and that is awful in Delphi. And yet at the end of the day if a client doesn't care in what programming language I'll solve his problem I'll choose Delphi
- battery_cowboy 6y ago>grind & RTFM Nothing is more true, as I start to relearn C after 20 years, that there is no substitute for the above. Literally, there is no good C tutorial or way to learn other than just writing some goddamn code and trying to make it compile.
- moron4hire 6y agoAnd then release your code and watch the people roll into the comments to tell you how you are doing everything wrong. Where were those people when I was trying to learn? Why haven't they written some God damn documentation? I know C lets you do whatever you want. I don't want to do whatever. I want to write software that is easy to maintain and doesn't fall over in a light breeze.
- axegon_ 6y agoThough those are good points, there are a few things to mention: once you know a few programming languages, jumping into a new one becomes relatively easy. That said, there are a few traps here and there(something I've also noticed when studying a foreign languages after knowing 2 others): "Oh that's the same as in {{X}}". And you pay no real attention to it as a result. A few days later you end up going to check what "{{X}}" was. My methodology as far as programming languages go, is the following: 1. Learn the nature of the language by understanding it's internals - is it dynamically typed, statically typed, functional, object oriented, single threaded, multi threaded etc. 2. If it's a compiled language, learn the hello-world and then spend some time to figure out how the compiler works. 3. Ecosystem - packaging, distribution, community, etc. 4. No IDE's, plain and simple vim. Getting off the line becomes a lot harder but it teaches you the fundamentals from the start without relying on anything fancy: Get your hands dirty. 5. While you are studying it, think of a small project to work on along the way in that language and try to push your current knowledge over the edge of what you've learned. After you learn a new concept, go over the entire project and see where it can be applied and what would be the benefits/drawbacks. Even if that means re-writing 90% of the project.
- karlicoss 6y agoRosetta Code https://rosettacode.org https://rosettacode.org is especially helpful when you know exactly how to do a thing on language X and Y, but don't know about Z.
- shpongled 6y agoDefinitely. I consider myself somewhat of a PL polyglot. After you've gotten experience in the different semantic paradigms (functional, OOP, imperative, etc), I think it's relatively simple to pick up a new language. It's mostly just a matter of learning some surface syntax and the standard library functions ('how do I concat two lists?', etc). The hard part is when you encounter a language that has complicated semantics.
- sixothree 6y agoI actually think #5 is the most important and shouldn't be discounted. I like three month projects - something moderate hard that might or might not get shipped. A summer of evenings sort of thing is usually enough to get a good grasp for me.
- s1t5 6y agoParts that are harder (for me) than anything on the list: - buying into a paradigm specific to the language at the beginning. Sure, everyone tells me that multiple dispatch is great in Julia, but that doesn't click until you write a decent amount of code. - frustration of dealing with exceptions, special cases and unexpected behaviour (R is full of these, for example) - teaching materials that pile all language features too early on which makes it realy hard to understand why you're doing things in a certain way (the Rust book stands out as an example of this) - the mental block of comparing the ease of use of the new language to one you already know ("this can be done easier in Python" can be applied to a lot of cases when you're a beginner) - more limited reasources than what you're used to. If you're used to a hugely popular language like JavaScript or Python, it's really noticeable when your new language doesn't have a StackOverflow answer for every question that you can possibly have.
- lerax 6y agoFor me the worse part of every new language is deal with ecosystem. Holy fuck. It is so annoying. Scattered info, standards, many solutions for the same thing and none is good, style guide, plugins and editors, debugging, packaging, testing, libraries, environment quirks, deployment compatibility, vendoring/semantic-versioning etc. Ironically, learning the language itself in general is the easy part, that other stuff that are just pain. I just love learning new languages, but I hate to deal with new ecosystems and all their bullshit. It is just terrible, always seems totally wrong for a outsider (ex.: JS with npm, .Net with versioning hell, Scala with sbt bugs, Haskell with Cabal Hell, Mobile dev with all complex setup) Fun thing: to make anything useful, dominate the ecosystem is essential. FucK.
- lmm 6y agoDon't bother using SBT. Just build Scala with Maven. It's wonderful, everything works how you'd expect, all the documentation from the Java world is still valid.
- auggierose 6y agoMaven is another sort of hell :-) Also, do you have good integration for building Scala.js as well?
- lmm 6y agoI've never got the hate for Maven - all the design decisions people dislike seem to be the same things that people praise Cargo et al for. If anything it suffers for being ahead of its time. Use the Scalor plugin, https://github.com/random-maven/scalor-maven-plugin https://github.com/random-maven/scalor-maven-plugin, and then Scala.js just works. I actually hooked it up to Netlify by treating Maven as a static site generator: http://m50d.github.io/2018/11/29/deploying-scalajs-with-netlify http://m50d.github.io/2018/11/29/deploying-scalajs-with-netl...
- commandlinefan 6y ago> SBT Me: “How do I xxx in SBT?” Them: “Read the docs, n00b” Me: “what docs?” Them: ...
- gumby 6y agoWhen first I read the title I thought it meant human language and so figured “oh yeah, be in a relationship with a native speaker” I’m not going to break up with my gf but we met specifically (at first) as we are both lisp programmers. Hmm, but actually it’s probably not a bad form of pair programming: “oh, you’d donut that way? Wouldn’t it be easier to express it this way?”
- seanwilson 6y agoThis is why e.g. JavaScript on the backend, web frontend and mobile can be compelling. Figuring out IDEs, code standards, test frameworks, build tools etc. for two languages can be a lot of work.
- pritovido 6y agoThe fact is that most of the things on the list are just trivial, but a nuisance to do because it is the boring, not glamorous part of the programming job. For me, the really difficult part of the language is understanding the core concepts, like what is a monad? or a functor? or a lambda, or a map, or an S-expression, a pointer, automatic reference counting,ip stack, neural network and so many more. Each of those concepts isolated can take more than a week to deeply understand. What this man calls "The hard part of learning a language" is quite simple and easy to do with the right method. The method I use is: - Take a notebook and write down a checklist with all the things you need to do. -Set an alarm clock to alert you after an hour of work. -Start following the steps on the checklist, mark them when finished and write notes of what you did. -When the alarm alerts you, stop working. Now rinse and repeat every day as a routine, doing other (fun) things so you don't emotionally link learning a new language as something terrible or bad. Instead of trying to do all the boring stuff one single day(and burning myself out) I split it. Learning different approaches to programming will pay off over time. It compounds and makes solving problems so easy in the middle and long term. But you are not entitled to improving. The fact is that nobody cares if you stop learning. They will just pick someone better solving problems and not making mistakes than you(because they continue improving).
- melling 6y agoI prefer to just get started by building something. A good By Examples or Cookbook is usually helpful. I actually started writing one for Swift: https://github.com/melling/SwiftCookBook https://github.com/melling/SwiftCookBook The functional examples get their own page: https://github.com/melling/SwiftCookBook/blob/master/functional.md https://github.com/melling/SwiftCookBook/blob/master/functio... Dictionaries, Arrays, Dates, Sorting, ...
- cblum 6y ago> I prefer to just get started by building something. I think you're missing the point (of the original article). That's pretty much the issue here, some languages have such complicated ecosystems that you can't "just" build something. To go from "ok I've written some code" to "it runs", sometimes it takes hours of wrestling with complicated tools and reading poorly written docs. It's infuriating.
- thanatropism 6y agoNot included: where’s numpy? Where’s networkx? Where’s either scikit-learn or scipy.sparse.linalg? I’m not a C.S. undergrad. I can be coaxed into rewriting random forest regression or whatever but there are even more pressing underlying matters. What’s the pipeline for reading CSV files or querying sql databases and laying results out on a dataframe-like for transformations?
- didibus 6y agoI feel those are more the tedious parts, then they are the hard parts. Maybe I just have a nack for that stuff, but it rarely takes me more than a day or two to have all that figured out. Once you get to mastering the paradigms, syntax and semantics is when the hard part begins.
- mohitk05 6y agoI can relate a lot to this. Maybe a part of this is also due to the language we are already familiar with. I'm not sure if the difficulty of your language would affect this, but I feel like learning a new programming language is difficult because we are very comfortable with the one which we already know. I mostly use JavaScript for various purposes. While moving to other languages, we expect certain things to be present naturally and be as easy as they were in your previous language. Several strong reasons, as you mentioned too, occasionally encourage me to learn a new language, but after a few days of frustration, I end up coming to JS. Maybe this is how JS/Python has spoilt me with the flexibility they provide, or maybe I am utterly lazy. One solution to this which I can think of is building a mini project related to something the new language you are learning was originally made for. For example, if you are planning to learn Rust, try a small CLI, or some low-level project instead of directly building a web server. I'm not sure if I'm correct though.
- rawoke083600 6y agoThe last year or so I really gotten into learning/exploring new languages and frameworks(don't flame me). I used to do it the old fashion way of just reading the docs or doing some tutorial.. BUT what I found out this last year, learning a new coding languages (and all it's eco-system) the best way is to watch a good YOUTUBE video ! It's sooo underrated I think ! You get to see all the steps (I hate it when the web-based-examples have code-snippets but the omit the filenames !) Try doing that in a new language or framework that uses a LOT of files (java, angular etc), plus you can speed up the video, I watch most "learning videos" at 1.25x
- fastball 6y agoI watch all YT videos at 2x speed and it’s still a slower way of absorbing information than just reading.
- biddlesby 6y agoYeah, definitely agree. Reading is a much more efficient way to absorb information
- marcosdumay 6y agoOh, I try never to have a video at all. It's slow, hard to search, hard to go back, hard to jump useless stuff, hard to comprehend, and hard to interrupt. Yet, the GP's point stand. If you see the video of a person starting a python project, it won't be missing the `virtualenv` parameters that he would omit in the text tutorial. Video also beats anything else (except physical presence) on discovering what somebody did to cause a bug.
- adwi 6y ago> And people keep telling me that $AUTHOR is a serial killer? What is this a reference to? It’s a hard google.
- nemoniac 6y agohttps://vole.wtf/coder-serial-killer-quiz/ https://vole.wtf/coder-serial-killer-quiz/
- jonahx 6y agoI think it's a reference to scandals around an author's politics or offensive online behavior. He's saying on top of all this other stuff, you might get shit for using language X just because people don't like the author of language X.
- microtherion 6y agoYes, I was wondering. I know of one prominent open source programmer who was a murderer, but he invented no programming languages and committed only a single murder.
- entha_saava 6y agoWho
- daniel-levin 6y agoI've just introduced a new engineer to a project in a language he hasn't used before. All of these points ring true! I want to suggest C# on .NET Core as a pleasant, fast language and ecosystem to learn. I used to avoid anything Microsoft like the plague. A friend of mine used to call me "the Unix beth din" [1]. By necessity I needed to use C#/.NET for a project. It changed my view, mostly because almost all of Mr Wayne's questions could be answered quite easily. The package management, build system, IDE, installers, test framework, debugger, and documentation are all from Microsoft, come well-documented, and on all platforms of consequence. It's a breath of fresh air compared to the clusterfuck of competing tools (e.g. gulp, webpack, yarn and friends for JS) with overlapping features and bad docs that some other languages are plagued with. In C# on .NET Core, MSBuild + NuGet handles this for you. Compiler selection, package installation, building, test running, custom build steps, code generation, etc etc. Plus, NuGet's website and interface in the canonical IDE (Visual Studio) shows you the "'canonical' packages the community has consensus on". [1] https://en.wikipedia.org/wiki/Beth_din https://en.wikipedia.org/wiki/Beth_din (the autority for what is and is not kosher)
- jstimpfle 6y agoAnother approach is to just not use these stupid tools. I don't want to propose anything in particular, but it is nice to have an environment with bounds. I like to have something that just lets me create my own shit. And lets me use the occasional library to avoid a year-long extra project, without requiring me to buy in to another ecosystem.
- wenc 6y agoAgreed. .NET Core and C# have been genuinely pleasant to work with from the start because of who was behind them — Anders Heijlsberg, who was author of Turbo Pascal and architect of Delphi. Anders is one of those guys with good taste and a practical streak. Many of us dismissed Microsoft back in the 80s and 90s, not primarily because it was predatory but because most of its stuff felt like commoditized output, had rough edges and lacked taste (Java today continues to have this latter problem). It was a bad halo effect. I’m primarily a Linux guy but I started out in .NET Framework a couple of years ago, and am now writing in .NET Core. The experience is definitely much more cohesive, more curated and less fragmented than the JS ecosystem. Anaconda Python for the most part is pretty cohesive in the Python world. (The Python packaging story is somewhat broken still but it works — packaging is a very difficult problem and no one gets it right entirely unless one is willing to tolerate opinionated inflexible solutions). R/Rstudio and CRAN pretty much just works.
- k__ 6y agoOT: is there a reason why my submissions are often attributed to other people right after I posted them when they posted before me and submissions of other people aren't attributed to me even tho I posted before them?
- pmachinery 6y agoNot sure exactly what you mean, but this has been submitted multiple times before: https://news.ycombinator.com/from?site=hillelwayne.com https://news.ycombinator.com/from?site=hillelwayne.com
- k__ 6y agoI see, thanks.
- pmachinery 6y agoIt's interesting that some things (even the same thing) reach the front page and some things don't though. It may depend on time of day, the interests of who's reading or checking "new", what other submissions are competing with it and perhaps who submitted it and/or who upvoted it. This has 111 upvotes now but even that raw number doesn't seem to matter; submissions can and do reach the front page with just a handful of upvotes.
- red_admiral 6y agoYup. You don't so much learn languages as ecosystems.
- tempodox 6y agoI hope this goes into a time capsule. I will shed some light on how life as a software dev was like in the early 21st century.
- goto11 6y agoLanguages often have a bunch of implicit assumptions which are not stated outright in the material. As a example, the Foo-lang [1] books starts (obviously) with how to write and compile a hello world program. Bar-lang books typically postpone this to the end of the book since IO and deployable programs are advanced concepts. I once talked to some Bar-fans about this and they simply did not understand why this could be an issue. Surely you could just echo "Hello world" in the repl as the first exercise? The underlying unstated assumption is that Bar-lang programs are primarily something you write for yourself and interact with in a repl, while Foo-programmers assume programs are written to be deployed and executed. Such unstated assumptions are not written on first page in the manual because they are invisible when you are immersed in the culture. Another example is a discussion I saw where a Baz-user claimed that everything was simpler in Baz than in Bong. The Bong-fan then asked how you loaded data from a relational database. The Baz-fan replied that only an incompetent moron would use a relational database, real men use text files which have less overhead. Now this could be dismissed as cognitive dissonance because Baz didn't have a nice RDBMS interface, but I think it is indicative of a deeper cultural assumption that the application can decide which format to persist data in, where Bong comes from an assumption that the data is already there in a given system and a workable program will need to be able to interact with it whether the developer like it or nor. Again, such underlying assumptions are typically not written in the tutorial, but have deep implications for the language design and ecosystem. [1] I changed the language names so as to not start a discussion about the particular languages. Although I'm sure there are actual languages called Foo, Bar etc.
- deleted 6y ago[deleted]
- waheoo 6y agoFoo = procedural (c) Bar = functional (haskell) Baz = bash ? Bong = hard to say because bash has a perfectly good interface to sql so im just super confused now.
- JadeNB 6y agoMention language names and people get hung up on the specific languages chosen, use generic names and people try to figure out what the obscured specific languages might have been ….
- sharker8 6y agoAll languages have an ideological component to them. Here is a list of languages with "everything is a $THING" in it. https://argumate.tumblr.com/post/118013166244/python-what-if-everything-was-a-dict-java-what https://argumate.tumblr.com/post/118013166244/python-what-if... As a pythonista language-naut like the author I think the fun part is trying on the language du jour's ideology and figuring out if you can get productive with it.
- lobo_tuerto 6y agoWhat I can say from a personal standpoint is that learning Elixir has been a really pleasant experience. Many of the points mentioned in there are well managed by the friendly community, and the superb inline help system.
- UglyToad 6y agoThis list almost perfectly matches my frustrations when learning a new language, and to be honest it's why I don't bother anymore. I started off in Python and have looked at Ruby, Pony, Rust, JavaScript, etc so I'm aware there are other ecosystems out there but I feel none of them really approach the ease of C# .NET, especially with .NET Core. On a new system I can install the dotnet core sdk, call `dotnet new mvc` then `dotnet add package npgsql`. I've got everything I need to write a web app that connects to a Postgres database. I can launch up Visual Studio for free and have almost unparalleled intellisense, etc. Or on a non Windows system Visual Studio for Mac or Visual Studio code. The project template gives me everything set-up and it 'just works'. If I'm not sure how to use a library I don't have to leave the IDE to browse through variable quality documentation, I can autocomplete to victory or use the REPL or just debug and write the code in the debugger with edit-and-continue. Once it's time to move to production `dotnet publish -r linux-x64 -c release` and I have my production ready deployable application. Now when I go back to Python or these other languages at least one or more parts of that process is missing. I know I'm biased but it feels like for other ecosystems the 'pain is the point'. It should be as simple as that and it needs tooling, especially an IDE to match. Almost certainly people feel this way about other languages they use, but I think there's an enraging habit for software development as a field to throw away the old tool we were used to and that was comfortable and worked, for some new thing that doesn't get the job done and is a godawful pain to work with (goodbye XML hello YAML). This really contributes to my burnout and disillusion with the field in general, though I'm on the road to recovery. Edit: This rant clarified what I'm actually frustrated with. There's no way .NET would have reached the (excellent) point it is now without competition from other ecosystems, the whole dotnet CLI owes a lot to other ecosystems and evolution does improve things. But I'm just sick, in this field, of feeling like a failure, or a fossil because people are constantly hyped about some hot newness and if it gets introduced, I'm going to have to learn it because that's the job. I'm not excited to learn flavour of the month cloud tool, or database replacement, or configuration language (I hate YAML so much) or language or framework. Other people are, and that's fine and good, but if those people introduce the thing at work then I now have to learn it and 9 times out of 10 we'll be having discussions 5 years down the road about why micro-services, or NoSQL or whatever it might be, was overhyped and we've found the right approach (which was almost identical to the approach before we started this). People should be free to have fun with those new tools, but I feel there's explicit or implicit judgement of people who just want to use the tools they know, that have known best practices and failure modes and whatever else. TLDR: you'll take my RDBMS from my cold dead hands.
- mmaunder 6y agoDatabase connectivity and OO are the point at which every new language becomes useful for me. I try to get there as fast as I can without skipping any fundamentals.
- karmakaze 6y agoTL;DR The Hard Part of Learning a Language ...is all the learning. Screw [all] this [learning], I’m going back to Python.
- cblum 6y agoThe author's point seems to be that it's hard to figure out where and what to learn. They're not complaining they have to learn new things.
- karmakaze 6y agoThe list of 'what' to learn is the list itself, with the exception of the unknown unknowns which will become known unknowns when encountered. This to me IS learning. Still reads like a rant after being faced with more learning than hoped. - How do I install it? - Which editor? IDE? Vim plugin? - How do I.. read a file? parse JSON? environment variables? How do I do any of the things that aren’t part of the core syntax/semantics but are super common problems people face every day? I’m going to have to memorize another 100 functions and their parameters, aren’t I? - What are the language quirks that will cost me an hour to discover? - How is the help organized? - I hit problem X. - How do I debug? - Testing. - How do I build? package? manage environment? - Package management. - So… the language community. Is it worth it? For most languages the answer will be "No", for others unless you've already really gotten into several very different ones you won't know.
- gilbetron 6y agoAt this point the hardest part of learning a language is unlearning the other languages. Is it "if-else if-else" or "if-elif-else"? Is it "def blah()" or "fn blah()" or just "blah()"? Is it "len(string)" or "string.len()" or "string.length()" or "string.size()"? Do I need a semicolon? Is it "lambda x: x+1" or "x => x+1" or ...? After that, I find the nano-culture of the place I'm using a language the hardest to figure out. "How dare you use {} instead of end", "Everything must be split into fine grained functions because long functions are death!", all the shit that really doesn't matter that much, but is just the fashion of the group I find myself in. It's like learning regional accents and terms with human languages.
- feedseed 6y agoBrave
- smabie 6y agoI kind of think the author is coming up with excuses, because he is afraid to learn a new language. Like, just start a new project, learn as you go. In a couple days, you should know enough to figure anything else you need to know on your own. In those first couple days, post on reddit or whatever. Also, why would you use Windows as a dev environment unless you absolutely had to? The author is creating artificial obstacles in order to justify not learning.
- blub 6y agoWell obviously if you're willing to spend the time you can do it. The issue is that they're not willing to spend the time, given that there are so many unknowns and decisions that have to be made. That's a very legitimate point, given that the default attitude in most programming communities is to pretend that learning new languages is almost zero cost and pure benefit.