Ask HN: What's your process for learning? - <AUTHOR> I'm interested in seeing if anyone has a process they use to help with learning.<p>- Do you focus on one topic/book/course/project/article at a time, or split your time between multiple things?<p>- Do you use any tools to track your resources, todos, notes, or goals?<p>- Are there any pain points you have while learning, or are there any tools you wish existed? <comment><USER3> The biggest test of what I've learned about learning was the day I had to learn embedded programming in twenty four hours.

A customer called me at 5 pm. They had a possible six figure hardware sale, but a key aspect of their hardware was too slow, their only embedded software/hardware guy was no longer working there, and they had to have the new code in 24 hours for a demo.

The software component to be sped up was three cores running handwritten assembly, and had been optimized by several people over four years.

The total of my embedded software experience was fooling around with an Arduino. I'd never written assembler before and never see this processor or its family before.

This was going to be good.

I wrote down the problem, and did the math to find out what the solution would have to look like.

It's hugely important to define the problem, and constrain the solution as much as possible. Nailing these down is probably the single most important "trick" problem solving.

With the problem defined, and the solution constrained, I printed the entire processor manual, and read/scanned it through in one sitting. I then went back over the memory and instruction timing sections, since that was going to be the hardest part.

I at least, learn much better by first scanning through a paper book on a subject. This lets you get the big picture all in your head at once, and see how things connect. Unlike just reading an overview, you also get to see the hard details that make up the way the system works. Then go back through later for the sections that matter for the problem you are working on.

I hooked up the customers hardware to the computer, flashed code the existing code to it, then changed the code to turn a status LED off. This was just to verify that I had the code to hardware toolchain working.

I've learned to bite off a small piece at a time, and then build up, rather than trying to solve everything at one go. The first code I ran on the processor just changed a status LED. This let me focus on as small of a chunk as possible, and deal with getting the new IDE configured, etc, without having to worry about the whole class of problems that would come from running my new algo.

I know I need X amount of sleep to solve problems. Even with a crazy deadline, knew I'd do still come out ahead. I went to bed at my usual time.

When I woke up, I knew how to solve the problem. The solution was similar to drawing a diagonal line on a computer screen - which is a really easy problem.

I've found that you can think in your sleep. Maybe this is just me again, but I've learned that as long as I clearly layout a problem, solution, and tools before I sleep, I wake up with the answer. I don't even wonder anymore if it's going to happen. Perhaps this is just the result of a lot of experience, but it never fails. If I'm stuck on something during the day, I just take a shower or a nap and know the answer afterwords.

Because the algorithm was going to be the most important part of this, I coded a JavaScript/HTML 5 canvas visualizer that gave me a live slider for the input variable and showed me a single view the output over many thousands of time steps. The JavaScript version of the algo worked great.

In optimization, the algorithm usually matters far more than anything else. It wasn't that I was the king of assembly language programmers, it was just that I was doing an entirely different thing than the previous programmers had been optimizing. I started with "what would the ideal solution to this problem be", and they started with "let's translate a hardware concept to software".

The second biggest trick to working with a new problem is visualization. I've learned that I can hugely increase my speed of understanding by building tools to visualize the problem and what my code is doing to solve it. For example in the recent, awesome, Halite programming competition, I built a tool that would let me output annotated html5 game maps and documents from within my code. Here's an example visualization output, straight from source code [http://braino.org/thoughts/halite_the_simple_way.html](http://braino.org/thoughts/halite_the_simple_way.html) OODA loops really do matter, and really are constrained by how much you can see how fast.

After breakfast, I worked out the assembly instructions I'd need, tracking the timing and register values on graph paper. I read up carefully in the docs on each instruction I'd need.

By lunch time I had a paper version that should work, and by 3pm I had it running in the product and had learned how to use an oscilloscope. The customer picked up the hardware and got the sale. The new version used one core instead of three and was measurably, literally ten thousand times improved.

I was now a carded member of the Real Programmers Society.

<comment><USER4> "I've found that you can think in your sleep. Maybe this is just me again, but I've learned that as long as I clearly layout a problem, solution, and tools before I sleep, I wake up with the answer."

\- This is something that occurs to me too, which is why I always scribble the hardest problem I have at hand before I sleep every night. Does wonders. :)

<comment><USER5> Not sure that I think in my sleep, but I definitely think on long bike rides, has to be more than 60 km though. I will sometimes set up a problem and then let it churn as I turn the crank. Restful and stress reducing too.

</comment></comment></comment><comment><USER6> My learning falls into a couple main categories: formal study for the sciences (be it math, programming, crypto, etc); and broad research for advocacy and activism. Both of these involve keeping up with current events, the latter moreso than the former; the former can be especially time-sensitive.

I don't have the time to put these in any coherent order, so I'll just list some:

\- Bookmarks. I find much of my information online. I make aggressive use of tags, and I found that organizing them into folders is too difficult and a waste of time (unless grouping them for a project/talk temporarily); the tree structure doesn't lend itself well to a graph of concepts. I have ~10k bookmarks. I keep them; you never know when they'll come in handy, even if only for trivia. Figuring out what tags are appropriate forces me to extract key material.

\- Maintain a reading list/backlog. I have short, medium, and long-term lists. Go through them on occasion and re-order them by interest/importance. Remove ones you know you won't have time for.

\- Learn to speed read. I find it difficult on a screen, but easy on paper.

\- Hands-on experience: if you're programming, go hack on your favorite project, look at bug reports, or write your own. Struggle through problems before you give up and look online.

\- My time is split between many things. I use Org mode to organize my thoughts and agenda. Sometimes I can do the entire project in Org mode (e.g. [https://mikegerwitz.com/projects/sapsf/tree/slides.org](https://mikegerwitz.com/projects/sapsf/tree/slides.org), but I left my time tracking private). It also integrates with my mail client (Gnus), where I live a good chunk of my life outside of work.

\- While I read many articles and blogs and stuff online, for any in-depth material, I buy the book or print the paper and read offline. I have a system with 5 different color pens that I use to aggressively mark up and underline (blue general concepts, red a problem, green a solution, purple a technical detail, black misc.). I have a Bamboo tablet, but I still prefer paper.

\- As I mentioned in another one of my comments (and as adamnemecek mentioned), read a book multiple times ([http://pne.people.si.umich.edu/PDF/howtoread.pdf](http://pne.people.si.umich.edu/PDF/howtoread.pdf)). It not only helps with absorbing the information and selecting what is important to you for further study (which is important given limited time), but also helps if you can't often finish books; after a few iterations, you'll have a good idea on all of the concepts and know _what information exists_ and _where to find it later_ when you actually need it. Discovery is the most important (thus my bookmarks)---material is always there to reference.

\- I don't have time to watch videos---I prefer transcripts, which I can also search through. If I do need to watch a video (either because it explains a concept better or because there is no alternative), I watch it at 2--2.5x and slow down when I get to something I'm having trouble keeping up with. Some people talk slowly even at 2x. :x

\- Get rid of distractions. One of the best things I did was create an agenda in Org mode, because once I complete a daily task (e.g. reading news sites; checking mail; checking GNU Social), I _stop_ and move onto another task. No peering at my e-mail or news sites 20 times while I'm doing another task.

\- Similar to the previous: I only work on personal things at night. I have a family, and I want to spend time with them---I feel guilty if I work during the day when the kids want to play, and all the noise is a distraction; it breaks flow constantly. Wait until a calm point.

\- Iterate over your system. Everything I do has evolved over the course of many years. The learning curve for some tools will slow you down, but can be very rewarding. The iterative process can slow you down. But that's not always the point: a good system can have returns in the long run, but it also _reduces stress_; you want to enjoy learning, enjoy the tasks you're doing, and not have to worry about other things. This might involve writing scripts, too.

I have more things, but that'll have to do for now.

<comment><USER7> This is a great list. As OP is possibly interested in tools as well, here are some of the tools I use for some of them in this list.

1\. bookmarks: pinboard.in / chrome plugin, add bookmark - add any relevant tags

2\. backlog: todoist.com with tagging

3\. speed read: beelinereader.com / found this to be useful but didnt use that often

4\. reading offline: kindle

5\. watching videos faster: video speed controller from chrome store

</comment></comment><comment><USER8> For books, you have to generally read them like 5 times. The first pass might take me like an hour, it's mostly to establish a general mental framework for what's in the book (actually try to read the table of content, and like familiarize yourself with the words you might not know). On the second pass, you will actually try to read the book and retain like 20% of what you read. On the next one try the next 30%.

This approach has the advantage that it lets you decide what's important. I also like to believe that it establishes better connections between the single ideas.

I would say that goals are counterproductive until you are somewhat comfortable but not when starting out. Like yeah sure, you should make some progress but you are in an uncharted territory, the best thing you can do is to walk around a bit and make sure you stay engaged.

If you move to a new city, you probably walk around the neighborhood for a bit, then to the neighborhood next to yours etc etc.

<comment><USER6> This was on HN quite some time ago:

[http://pne.people.si.umich.edu/PDF/howtoread.pdf](http://pne.people.si.umich.edu/PDF/howtoread.pdf)

I find it valuable for another reason: I'm always constrained for time, so I might not get through an entire book. If that book is deeply technical, it discourages me from continuing, because I have to take the time to re-skim what was read previously.

I somewhat recently started trying the above method. With multiple iterations through the book, I can get an idea of the information and at the very least know where it find it and that it exists. Depending on the iteration, I'll have some notes to fall back on, or have some important concepts underlined.

<comment><USER9> This is also why you shouldn't just watch beginner tutorials on complex software like 3d modeling packages or digital audio workstations.

Those are good, but you should also watch professionals use the tools on really complicated projects in person or in screencasts. While you won't be able to follow along fast enough and will be in way over your head, you will learn what's possible and be able to remember in the future when you run into a problem that needs complex radial symmetry, or whatever, that there a way that is much faster.

It also broadens your notion of what is possible in the application, rather than trying to reason from the ground up of the simple tools you have learned in a beginner tutorial.

</comment></comment></comment><comment><USER10> I almost always only learn things that I can immediately apply afterwards, because otherwise I find I don't retain enough useful knowledge that I have to go through the same learning resources again by the time I need the knowledge.

I have two learning modes. When I first come across a new topic, e.g. hadoop, I will go broad and skim as many learning materials as I can to get an idea of the lay of the land. Once I feel confident I have a handle on the major parts and technologies involved, I'll switch to the second learning mode and work through the subjects / technologies one by one by searching online for "best way to learn X", figuring out what the common denominator is, and then working my way through that while taking notes in onenote.

The note-taking is crucial for retention as well as keeping track of salient points (it's all in a onenote notebook, so I can find something relevant again even if I don't recall the particular book it was in).

What I wish existed was a sort of wikipedia for learning, keeping track of every subject / technology and giving a reference to the best learning materials in a crowd-sourced way. Right now learning sites focus on their own content, but it's not always the best, and it is not crowd-sourced. The best hits for learning resources are usually stackoverflow or quora links, but neither are the right format for such a thing.

<comment><USER11> >What I wish existed was a sort of wikipedia for learning

I write (private) wiki pages for myself when learning a new tool or tech. However, I think the process of taking in information and rewriting it in my own words is more valuable than the wiki pages themselves. Plus it's a handy way to store relevant links and brush up on a topic if I don't engage with it for awhile.

<comment><USER12> What tool do you use to make your private wiki pages?

</comment></comment></comment><comment><USER13> I think the question is a tad ambiguous. Are you talking about learning from scratch or building on what you already know?

The common thread in both is mastering the foundations. I know this is controversial, but I believe in book learning before playing whack-a-mole around the internet, simply because you aren't at the point where you can differentiate the signal from the noise.

After the foundations, I learn on a need-to-know basis, which is generally more applicative: if you are trying something that's never been done before, then the perspective is top-down instead of bottom-up.

I don't use notes, todos, online tracking, or whatever goal-oriented resources people are using. I don't see learning as a goal-oriented exercise so much as an accidental accumulation of knowledge. Knowledge gained best from a genuine interest in the subject at hand, which often leads into a genuine struggle to learn some topic, either because it is genuinely difficult or it something you find boring but necessary to learn to continue.

I'm an autodidact, and really, the best advice I can give is learn yourself first. Be absolutely honest with yourself about your interests, your limitations, and the answers, via a long journey of trial and error, will eventually come to you. The fact is, we aren't all able to fit into a mold, and no matter how much advice you read... advice reading is pretty much worthless without a grounding on failure.

</comment><comment><USER14> I made a tool to help making notes while studying. Aim was to make something which allows you to:

Add text and images quickly, so you can type along with a lecture, or by copying and pasting text, html or pdf from documents you are reading. At the same time it must be easy to add and scale images.

Tidy up and restructure your note. Just typing your notes is not enough. You also need to think about it, and restructuring or tidying up your notes is a great way to do that. The tool you use should not make you redo or rewrite the notes completely. It should just be click and dragging without messing up the formatting.

Show structure in multiple ways (colors, sizes, shapes, connections etc). Making notes in a text editor is limited. You need something that does not just scroll up and down, but also left and right. Something that looks more like a diagram or a mindmap, to which you can also add connections, labels, arrows, and colors. Having notes that look more like infographics helps me alot to remember or retrieve what is in them.

Have overview and detail in the same map without to much clutter. I myself like having notes on a topic in one document, but it must still be easy to show the structure and the details.

I am pretty pleased about how all this works in Breakdown Notes (my project). If you would like to check it out I suggest you take a look at an example map about english grammar: [https://www.breakdown- notes.com/makemap/load/grammar](https://www.breakdown- notes.com/makemap/load/grammar)

<comment><USER15> You sneaky little b____d using an ASK HN for advertising :P. This actually looks useful. I'll give it a try sometime.

</comment></comment><comment><USER16> You might like:

[https://www.coursera.org/learn/learning-how-to- learn](https://www.coursera.org/learn/learning-how-to-learn)

<comment><USER17> But what's the best way to learn how to learn?

<comment><USER18> I think that, first you have to learn how to take courses on how to learn on how to learn, then you may progress to taking course on how to learn how to learn.

</comment></comment></comment><comment><USER19> Doing.

I pick a project that interests me at some point; currently "I'd like to have an internet music player that sits on my cupboard and doesn't require my tablet".

Then:

      * decide on platform (CC3200, because it has wifi, enough processing power,
        and I happened to have one)
      * build something that decodes an MP3 stream (investigate, pick Helix as the decoder,
        make it run on the CC)
      * think about hardware (DAC, amplifier)
      * think about enclosure (wood, how to do front panel)

I knew next to nothing about many of these things when I started, and I'm making lots of mistakes along the way, and I won't become an expert in any of these things, but the overall goal/"target" provides a guide to decide what to learn next. A search engine then helps me find the resources I need.

For tracking my progress, I've started to use Emacs org mode.

<comment><USER20> Came here to say this. Couldn't have said it better.

</comment></comment><comment><USER21> I usually focus on one goal at a time and dedicate all the time I have available to it.

The key is that I must have something I want to accomplish as a reason to learn something new. For instance, if I just decide to learn a new programming language, I will lose interest very quickly. But if I decide I wan't to create a new app, I can then use that same programming language for the job and I will consume every information I can in order to make it happen. Usually using google and youtube to find the resources. I start from the basic I need to start and go on from there.

I've used that method to learn new programming languages, surf fishing, technical analysis/investments in the stock market, grow plants, electronics, cooking, etc.

TLDR; focusing on a project makes it easier to learn as you need the information in order to make it happen

<comment><USER22> That's what I do too: make something to learn something. Currently writing an android app to learn Kotlin.

</comment></comment><comment><USER23> _> Do you focus on one topic/book/course/project/article at a time, or split your time between multiple things?_

For me, I deliberately split across multiple topics/books because my brain has different thresholds of concentration depending on time of day. The early mornings are best for more challenging subjects (e.g. math, deep learning algorithms, etc). At night, it's easier to read softer topics like history and politics. I think it's important to pay attention to your brain's energy levels and when/how it gets distracted. With that knowledge, you optimize your learning schedule around that.

 _> \- Do you use any tools to track your resources, todos, notes, or goals?_

Since learning time is finite, I think it's a important to put together a little curriculum of all the topics you want to learn. Prioritize them.

 _> Are there any pain points you have while learning_

Another piece of advice that nobody ever seems to emphasize (but I wish I had known early in life) is that there are topics that will be _a waste of time to learn_. In my case, I regret I spent hours on PowerBuilder, IBM DB2, and DOS batch scripting with VBScript. It doesn't mean those skills are bad for others but a little research would have made me realize there were other more important skills to spend precious hours on. (Time spent learning X is time not spent on learning Y.) The tldr is that people will often evangelize things for you to learn that you really don't need to learn. They have good intentions with their advice but they don't know the complete picture of your life's goals.

<comment><USER24> Do you have a heuristic for determining what is/isn't worth learning? I personally try to learn the lowest level things I can, as I know that will have broad applicability.

</comment></comment><comment><USER25> I read whatever interests me until it doesn't interest me any more, and I quit reading things that don't interest me. I don't say that to be flip—it's actually what I do, and it has allowed me to consume an enormous amount of material over the years. The only trick to this method is not to confuse difficulty with boredom. There are times when I learn to code, for example, or when I read about obscure financial wizardry or mathematics, where my mind drifts and it _feels_ like boredom. But the reality is just that it's hard. Sometimes when things are hard you do have to change your track until you've developed prerequisite knowledge to come back to it. Just make sure in those instances not to decide the thing was boring because you couldn't handle it on the first go.

</comment><comment><USER26> > focus

For casual learning, I split my time across various subjects and do whatever feels interesting. For serious learning like a certification, I set goals based on e.g. time spent studying.

> Tools

I use plain text files, either a single file or a folder full of them. I try to develop a sort of learning system for the subject in question.

> Pain points

I was too reliant on outside sources before and did not spend enough time creating "my own" knowledge through hypothesis, testing, measuring, etc. Nowadays I realize I have very little need for most of my books; it's more fun to see what I can come up with on my own.

I also wrote up a "learning ladder" that ranks various forms of study; for example before opening a book or a browser tab on a topic I will check to see if there's a short YouTube video available. After that I might look for an ELI5 on Reddit. Then eventually you get to books.

While that may seem obvious, it represents my taking responsibility for my own learning and I am a more motivated person because I created the ladder by myself and continually work on it. I have hundreds of these systems in areas from learning to fitness to work operations to finances, etc. When I go on vacation it's the #1 "book" I enjoy reading and pondering (I save all the .md files to Dropbox for reading on my phone).

</comment><comment><USER27> I'm surprised nobody has mentioned Anki cards. It's a scientifically proven method to learn any topic through spaced repetition.

Any time you find some thing you want to learn - add a card to Anki. Anki will make sure you never forget and truly understand the topic.

I highly recommend AnkiApp: [https://www.ankiapp.com](https://www.ankiapp.com)

Or: [https://apps.ankiweb.net](https://apps.ankiweb.net)

<comment><USER28> could you post your anki's setup? Thank you

</comment></comment><comment><USER29> I work in the field of natural language understanding and in the last few years I've figured out how to use that very advantageously wrt learning.

Here's the approach I use:

\- Every time you come across a new term or concept, you create a new "notebook"/document. That's right, one notebook per concept. The title of the notebook is the name of the concept.

\- You create a summary for the concept using bullet points. What you're trying to maximize with this set of bullet points is the speed at which, in the future, you can re-read them and achieve a similar brain state to what you had when you originally learned the concept.

\- You can then obviously have extended notes below that where you go into more detail.

\- Then, crucially, you create something akin to a regex that will allow you to quickly and unambiguously look the concept up in the future. If you just learned what a rectified linear unit is, your pattern might simply be:

rlu | (rectified linear unit)

\- You then have a hotkey on your computer -- I use Ctrl-Q, that brings up a text box where you can type the name of the concept you want to bring up (ex. "rlu"). When you press ENTER, it doesn't give you search results if there's an exact match, but instead directly opens the document and makes it instantly viewable / editable.

\- As your concept graph starts to grow, you have links within your notebooks to related concepts as they're referenced.

\- Each time you read an article that is important to your understanding of a concept, you quickly open up that notebook and add that article, and perhaps one or two bullet points that contain the key things you learned that expanded your sense of that concept.

\- This same system can be used for more than learning text book information. You can use it if your a project manager to keep tabs on the millions of things you have to juggle, you can have notebooks for people, for lists, and you can have "regexes" for "programs"/scripts, for web pages, for files/directories, etc, etc.

\- More general than "regexes" are context free grammars. In this context what that means is the ability to have named "subroutines" for your regexes. For example, if you end up using RLU as a sub-part of a lot of other notebook regexes, then you might define $rlu to be a short form for (rlu | (rectified linear unit)).

</comment><comment><USER30> Work on projects that you are passionate about. Work together with peers, get help when you are stuck and help when they are stuck. Be playful, do not be afraid of making mistakes and do not focus on perfection.

I warmly recommend Pragmatic Thinking and Learning by Andy Hunt and Alex Martelli's lecture "Good Enough is Good Enough!" from EuroPython 2013: [https://www.youtube.com/watch?v=gHG9FRSlPxw](https://www.youtube.com/watch?v=gHG9FRSlPxw)

More notes on learning: [https://www.simongriffee.com/what/learning/](https://www.simongriffee.com/what/learning/)

</comment><comment><USER31> Depends on what I'm trying to learn, but for things like Math and other technical topics, I'll try to find textbooks/video lectures, go through them, while adding them to Anki.

If you don't use Anki - you really, really should. I'd be lost without it - it's one of the greatest life-hacks I have. Without it, I don't really feel like I've learned something "for life", only just for a moment.

Also, reading multiple textbooks on the same topic is in general much better than just reading one, preferably in slightly increasing complexity.

<comment><USER32> Totally agree on Anki. It's not just for language learning (although it's great for that - I use it for Japanese). I also have a deck for those day-to- day random facts I used to just keep forgetting - family birthdays, proportions for French press coffee, etc.

Gwern calculated the total time spent reviewing the average card is 2 mins across your lifespan ([https://www.gwern.net/Spaced%20](https://www.gwern.net/Spaced%20) repetition) - so anything worth ~3mins investment to learn can go in Anki and you'll never forget it. It's magic.

<comment><USER31> Absolutely, and I love Gwern's article as well. I use it for random facts, remembering faces, pretty much anything I learn academically that I can (economics, maths, etc), as well as studying some "lists of facts" just cause, like the location of all the countries in the world.

It's also an amazingly designed piece of software in terms of functionality, even if it does have a bit of a learning curve.

Honestly, my only complaint is that I can't figure out how to give them money! I'd love to donate to them but can't seem to :(

</comment></comment></comment><comment><USER33> I actually started using a search engine I built for choosing what and how to learn things.

[https://learn-anything.xyz/](https://learn-anything.xyz/)

As for learning I usually mind map concepts I thought were interesting and then review the mind maps and create flash cards. It depends on the content however.

If it is something actionable like learning a programming language, I try to use the knowledge straightaway and build things. :)

<comment><USER34> This is great project, thanks for sharing!

</comment></comment><comment><USER35> It depends a lot on the topic. For coding/tech, I find working through an "organized collection" of video tutorials by rewriting the code locally and taking notes along the way, works very well. It's time-consuming, but I tend to retain more concepts after watching, listening and practicing, since it engages more senses (vision, sound and touch).

Prior to learning a new topic, I try to make mind/concept map of the material based on my initial understanding from reading articles or browsing books, docs and examples. It also helps to have an end goal or project in mind to connect concepts to actual outcomes. You can also try explaining what you just learned to a non-technical person; forcing you to "make sense" of a concept while converting to non-technical jargon.

Overall, it just takes time. After years as an autodidact, I haven't found many short cuts around hard work. There are many great techniques out there-- some will work for you and others won't--but consistent practice is usually the underlying theme.

</comment><comment><USER36> 1\. Read a little until I'm itching to try to apply what I know.

2\. Try it.

3\. Reflect on what went wrong.

4\. Go to 1.

</comment><comment><USER37> Usually, when learning something, I have a project to work on to apply my knowledge to. I find that I'll start by searching for some good resources. This is typically books, blogs, subreddits, screencasts, awesome-X, etc. Then I'll spend an hour or two a day learning from whatever resource I'm using, and spend the rest of my time working on the project, applying what I've learned.

Sometimes I don't have a project to work on, but I'm interested in something. For these things I'll push to use on new projects at my company, and will read a book or two about them prior to convincing people its a good idea. This isn't always ideal because the knowledge doesn't really stick without applying it to projects, but it scratches my itch to a certain extent.

</comment><comment><USER38> My favorite way to learn a new topic (which consistently works well for me) is to read several books about the same topic back to back.

I find that if I read three books by different authors on let's say React for example, which are all meant to cover the basics, I learn much more than by reading one book three times. The difference in the authors voices and inevitable variability of emphasis and style throughout, really helps me stay engaged and pick up the things I might have missed in the last book.

I'll usually do this first, then move on to tutorials and deep dive type books which are mostly a breeze by the time I get to them because of the very solid fundamental foundation provided by the initial book set.

</comment><comment><USER39> Setup

[ ] Define a subject, and a goal

[ ] Get resources

[ ] Create a topic list

[ ] Filter the resources and assign resources to the topic list

[ ] Think about possible projects

Study \- For each topic

[ ] Collect data in a reference note

[ ] Create flashcards

[ ] Search and create questions / exercises

[ ] Explain the subject in a piece of paper (Feynman's technique)

[ ] Apply the knowledge in quizzes and practical projects

[ ] With notes, explanation, quizzes and flashcards create a KL

\-----

\- Do you focus on one topic/book/course/project/article at a time, or split your time between multiple things?

> I focus on topics, not resources. But I split my time into multiple > disciplines.

\- Do you use any tools to track your resources, todos, notes, or goals?

> Yes. Evernote(Premium)

\- Are there any pain points you have while learning, or are there any tools you wish existed?

> Yes, a good markdown 'platform' compatible with Linux/Windows/Android

<comment><USER40> we think alike! I have this process written down and pinned to my wall. I have been refining my thought process regarding learning. currently I have:

1\. try to find a overarching synopsis of the main topic or goal. This can be done by looking at a summary article or by skimming the summaries of a textbook or by checking an expanded table of contents

2\. Extract major topics and write these on a spreadsheet/graphical program/(giant) index card/ paper. If you used index cards or a graphical program or index cards try to discern dependencies between these topics by using the gui tools or simply laying out index cards on the ground.

3\. Find resources that explain the topics. The resources do not need to be from the same resource. One source can explain topics a,b,c well but not d. You can use another resource for topic d.

4\. map projects to topics: extremely important. After finding out the topics and associated resources, you should be able to come up with applications of the topics. These could be as simple as solving problems from a textbook or they can be grand like building a motorcycle (actually, that's too grand). Keep the primary goal to be learning the topics you set out to learn or completing your goal.

5\. execute the projects

6\. check off topics as you encounter them

7\. reflect on the results of the project or application

8\. if you encounter difficulties find more resources and drill down on topics you found interesting or challenging.

Not perfect, but its working well for me. You can start from practical applications or theoretical concepts. Books are great because they contain a structured approach to a topic. ALWAYS MAKE SURE THE BOOK HAS PROBLEMS THAT HAVE (some)ANSWERS!! You should be able to do quick knowledge checks.

topic based learning is more difficult and I feel like it's like making your own sandwich vs buying a prepackaged one.

</comment></comment><comment><USER41> Other people have covered in detail different approaches to learning, so I figured I'd mention a weird thing that's been helpful for me, in case it's useful.

While learning, I try to split off a little piece of myself into a sort of adversary, whose job it is to get me to do basic problems / tasks, in order to demonstrate that I don't remember as much as I think I do.

This might happen in the form of spending an hour one morning leafing through older material, and setting aside things for me to solve / re-prove. It's pretty simple, and I take some kind of perverse joy in finding areas where I thought I would remember much better.

</comment><comment><USER42> Two classes of problems: something related to what I'm already well versed in is different to something that I'm a noob.

For noob stuff, I make and quiz myself with physical cue cards. The act of writing the card and the answer seems to be 75% of the memorisation i need but i forget quickly... related to that, i write myself 'guides' that I wish i had read weeks/months before when i didn't know anything. something about writing the subject down as if i'm teaching it let's me anchor the beginning at a level that i can treat as a given and then baby steps all the way to the end. it's a bit Feynman-ish in that it really does force you to acknowledge when you're skipping over something and just rote-memorising.

Also, treat black boxes as a known unknown that you can always go back to. You often have to link up a dozen black boxes to get anywhere and if you go down each rabbit hole, you'll never get to the end. Better to play with them, get a feel for how they are behaving and dive in if/when they aren't doing as expected.

Quiz yourself. After a while it gets quite relaxing to glide over problems that stumped you when you first thought your should write them down. helps remind you that you _are_ learning.

Lot's of books/articles etc covering the same topic and re-reading them. You're different each time and you never know when you are _ready_ to learn that particular thing.

</comment><comment><USER43> I would look at Timothy Kenny's courses on Udemy for a really good explanation on this.

There is also a book called "Cognitive Productivity" by a professor at Simon Fraser university I recommend you check out.

Sadly there is not a lot on this subject. A good example of this is the fact that right now, the only traditionally published book on this topic is literally called "How To Read" and was published in the 1940's.

\- - - - -

To directly answer the question though, you should: 1\. Read a book and use a pen instead of a highlighter. This allows you to not only underline but also write in the margins insights 2\. Type up your raw notes 3\. Take your raw notes and the synthesize them into a higher level summary of the main points 4\. THEN, THE MOST IMPORTANT STEP, take your synthesized notes and create a "concept map" of them, something visual. Mind Maps are a good example of this, but they're only 1 type of concept map. This is extraordinarily easy to remember, and ideally you want to create a visual diagram for each book you read. These pictures or patterns are incredibly easy (comparably) to store in long term memory than recalling say 3 pages of notes. Also they are far easier to draw and convey to another person.

</comment><comment><USER44> Try to get learning working in multiple aspects of your brain at once. One of the best "learn about learning" lessons I ever had was studying jazz theory. My teacher used a four-way method of learning chords - say the name of the chord, visualize it on the keyboard, feel the shape your hands make to play the chord, and listen to the sound of the chord. I've applied this sort of approach to all sorts of skills since then.

</comment><comment><USER45> Here's a quick clip on learning and knowledge from Richard Feynman one of the greats in physics. I suggest you watch the whole video, it's good but at the last minute or so he summarises learning and knowledge in his view. It's GOLDEN!!

Here it is:

[https://www.youtube.com/watch?v=dQai9QikTBI&feature=youtu.be...](https://www.youtube.com/watch?v=dQai9QikTBI&feature=youtu.be&t=739)

</comment><comment><USER5> My learning style is Abstract, Connected, Historical, Written, Social

This means I need to understand the theory first and work down to practical examples (many people learn the other way around but not me). I need to understand how one set of abstractions or theories connects to others that I may understand better. I like to go back to origins, understand motivations, follow the evolution, and see what paths are thought to be dead ends (like machine learning was thought to be a dead end by many people around 2005). I only really understand things if I write them down and preferably write about them. I learn best when I learn with other people, my wife jokes that when I want to learn something I start a company.

Given my learning style, yes, I need to be learning several things in parallel, helps with the connections. I also tend to read too quickly so having three or so learning themes at any time helps me to slow down and reflect.

I have been tracking my learning in granular detail for about ten years using Excel. I am also tracking it on TeamFit.co Every year I build a learning plan (goals, resources, evidence) and track against that.

</comment><comment><USER46> I take the most practical approach possible, because it allows me to get to my goals as fast as possible.

Usually, I want to learn something because I want to do something with that knowledge. So as an example, if I wanted to develop an app on a platform or in a language I have never used before, I would start by reading some general knowledge about the language or platform, to get my mind going. Maybe grabbing a book or finding some good online basic tutorials. I usually never finish the books, because I often get to a point where I understand enough to start asking specific questions that I need answered in order to make progress on my project. So I stop with the general knowledge, as I have enough understanding to actually start implementing things, and I start researching the specific questions I have for making progress on my app. And I just start executing and working on it, and researching answers as I go. This way, I learn as I go, and I keep myself motivated by actually having deliverables at the end of each "lesson" I set for myself.

</comment><comment><USER47> I learn best by doing. I imagine how something might work (I am usually wrong!), and try building it. When I discover that I need to learn something, I try to communicate what I'm trying to build, why I am trying to build it, and where I got stuck. Then I ask around a bit (StackOverflow, Quora, Reddit, coworkers) to see if someone has insight how I might succeed. The depth and quality of answers I receive hint at the quality of my question, or the familiarity others have with the problem I am solving.

If I get no answers, I usually grind away at the problem until I lose interest, can ask a better question, or make enough progress that I can answer my own question.

Useful answers include offering:

\- a suggestion to use alternative solution with acceptable trade-offs

\- a different approach to how I solve my problem

\- a specific answer to the question I asked

\- to collaborate with me in finding a solution

\- a supportive comment (the cutting edge can be lonely!)

\- understanding about a trade-off or consequence of how I am approaching the problem

\- a suggestion on improving the quality of the question

\- a referral to someone who knows the answer

</comment><comment><USER48> I built a tool to hep me find good talks, [https://www.findlectures.com](https://www.findlectures.com). I've been curating some of the best of these and sending them out in an email ([http://www.findlectures.com/emails](http://www.findlectures.com/emails)), which has forced me to push a lot further exploring available topics.

I split my time between multiple topics, generally aiming for variety over depth, and collect recommendations for books / speakers from various places (friends, Hacker News, the evening news, etc).

I've found that having multiple simultanous books or project s is helpful, because they can interact in interesting ways E.g. one author has accidental insight into the topic of a second book, for instance, or a footnote to a problem in one project solves a major problem for the other project.

</comment><comment><USER49> Here is the key insight (from, in my mind, Gilbert Ryle originally):

There is a difference between knowing that, and knowing how.

When you want to learn that something is the case, read.*

When you want to learn how something is done, do.

If you want to learn how to do something, and you are not doing the thing, then you might find yourself not learning.

* You can take notes, summarize, and repeat.

</comment><comment><USER50> In my experience, understanding theoretical concepts is challenging because the process of learning is often not legible [0].

What has worked for me is having multiple periods of immersion into a concept or topic, while referring to multiple sources, with notes [1] summarizing small bits as I learn them. I keep refactoring those notes as my understanding grows, to include coherent maps of larger and larger chunks. On short time scales, my learning is not measurable, but experience indicates that my understanding grows over time. Looking back, my periods of immersion range from a few hours/days, while I tend to revisit topics every few weeks/months. I guess this falls under the umbrella of spaced repetition methods.

Since my interests and pursuits are very diverse, and I'm seldom "finished" with something, I don't like the psychological weight of todo lists [2]. I maintain lists of interesting stuff [3], and several hundred browser tabs [4] but they're mostly not things to be checked off, and languish peacefully for long periods. That said, I'm on the lookout for better knowledge/idea management workflows and software. What I currently use is organically grown, and very messy.

That was for theoretical understanding. Practice helps, for things one "does".

\---

[0]: Venkatesh Rao: A Big Little Idea Called Legibility -- [https://www.ribbonfarm.com/2010/07/26/a-big-little-idea- call...](https://www.ribbonfarm.com/2010/07/26/a-big-little-idea-called- legibility/)

[1]: Markdown files, or scribbles/diagrams on scratch paper

[2]: Scott Hanselman: It's not what you read, it's what you ignore -- [https://www.hanselman.com/blog/ItsNotWhatYouReadItsWhatYouIg...](https://www.hanselman.com/blog/ItsNotWhatYouReadItsWhatYouIgnoreVideoOfScottHanselmansPersonalProductivityTips.aspx)

[3]: Zim Wiki notebook -- [http://zim- wiki.org/manual/Help/Notebooks.html](http://zim- wiki.org/manual/Help/Notebooks.html)

[4]: I <3 Firefox and the TabGroups extension

</comment><comment><USER51> I have different processes and strategies depending on what I am learning and how familiar I am with a topic. For example, if I would like to explore a brand new topic that I have no clue about then this is how my thought process looks like:

1) Look for verticals/lists of resources. These exist in all fields, awesome- lists are just an engineering example, universities keep lists of open courses, list of book recommendations or lists of open-sourced books.

2) Look for key figures in that field. PhD Researchers, Conference Presenters, TEDx Talkers, Professors, Founders of Companies in that field. Follow their pages/blogs/twitter accounts and ask them what resources do they recommend for beginners. Compile your own vertical of resources based on cross matching the resources here with the ones you found in other verticals.

3) Look for courses, new ones are usually offered on MOOC Platforms, archived ones can be found on university websites. Check the reviews of such courses and pick the most beginner friendly one. Depending on the field, if it's not technical then you will have to look for courses elsewhere, for example: The Great Courses.

By now you should know, roughly, the best resources (Books, Articles and Courses) and how to find more (verticals and people in that field).

4) Learn the terminology. One way to learn the terminology of a field is to pick the book you decided is best to start with using the previous 3 steps, open it and go to the index section, read the index and start googling terms as you come across them, for example: If I am exploring Data Engineering and I come across the word or term "stream processing" then I will start googling that term. Familiarise yourself with as much terms as possible.

5) Commit to reading at least 1 book, going through 1 course and trying to apply as much of what you learned as possible. Technical subjects are the easiest to apply this step to, since you can start a side-project at anytime.

P.S. you can always ask for guidance in this, you don't have to repeat all the steps for all fields, for example, you can submit an "Ask HN" post asking for resources about X topic or a question on a related Subreddit such as: /r/PostgreSQL.

Best of luck!

EDIT: typo

</comment><comment><USER52> Learning what? Welding? Practice, practice, practice.

I focus on the thing that I'm most interested in at the moment. That is rarely an entire book, though I've done that too.

If I feel like I need to take notes to keep track of what's going on, I will do so. I might also leave a note about things I've skipped or glossed over and should want to (re)visit again later.

The biggest pain point is usually scattered information, or information that assumes some background you don't have and doesn't give you enough clues to fill in.

</comment><comment><USER53> I think this question can be best answered by first looking at what research tells us about learning (otherwise your question attracts only anecdotal responses which will be less universally applicable). Here's what research says, followed by how it applies to your questions in particular.

1) Mastery based learning is generally the most effective process (learning each axiom of a topic to 100% before moving onto the harder topic)

2) Spiral based learning is an effective add-on to mastery based to keep you remembering the things you've learned (coming back to a topic just at the point of forgetting keeps you retaining knowledge)

3) The content you learn off of (video, text, etc) has different attributes which may correlate to better transferring of knowledge: Shorter videos, hand- written visuals, enthusiastic voice, have all been shown to correlate with better learning outcomes.

4) The motivation you have for the topic you're learning and how much closer it exists to intrinsic/extrinsic motivation dictates how well you'll absorb a topic. The closer to intrinsic, the more effective learning will be. Project- based learning generally falls into this category: projects that interest you motivate you to learn more.

Now with all of that in mind, to answer your questions:

> Do you focus on one topic/book/course/project/article at a time, or split > your time between multiple things?

(1) would suggest that you should not split your time, at least at first, unless you are trying to find a better explanation (3)

> Do you use any tools to track your resources, todos, notes, or goals?

Most of the suggestions sound like meta work. I wouldn't suggest tracking todos so much as perhaps writing down the things you've learned to prove to yourself of (1) mastery or to come back to later for (2) spiraling.

> Are there any pain points you have while learning, or are there any tools > you wish existed?

Sounds like you are trying to make a tool to help people learn/track learning at a high, abstract level. Because there is no one right solution to everything because of (3) and (4), whatever tool you create may not actually help anyone unless it's more domain-specific and less abstract.

</comment><comment><USER54> Head. Wall. Repeat.

Persistent effort. Work it out yourself. Don't just read it, think it, play with the concept until you can generate examples and explain them to others.

</comment><comment><USER55> Several comments mentioned that the best way to learn is by doing - <USER2> the knowledge. How would you go about learning-by-doing something like particle physics or advanced chemistry without access to labs? Are you reduced to creating homemade soap and rote memorization of theory? Could you ever make a meaningful contribution or get a job as an autodidact in either field?

<comment><USER56> > How would you go about learning-by-doing something like particle physics or > advanced chemistry without access to labs?

You can't! That's what makes computer programming so special - no lab needed. Anyone wishing to learn physics or chemistry better have access to a lab sooner or later. That's just the reality of it.

</comment></comment><comment><USER57> If you're doing needfinding for a project idea to enhance learning, my suggestion is to focus on a single DOMAIN of learning first rather than trying to make something to help learning in general, since it's such a vague and broad problem. e.g., "how do you learn to do your taxes?" or "how do you learn basic home maintenance?"

</comment><comment><USER58> I'd like a desktop app that, when engaged, would monitor browser usage and lightbox my screen after 3 minute of browser use with a simple question "Are you solving a problem or taking a break?". If I choose "taking a break", I'd like a 1 minute countdown timer engaged with a suggestion to focus on breathing instead.

Please? Pretty please? :)

</comment><comment><USER59> I wrote a summary of a Coursera course, which I highly recommend, " Learning How to Learn " and a book " Deep Work: Rules for Focused Success in a Distracted World ". You can find the first draft here [https://goo.gl/mfNhp1](https://goo.gl/mfNhp1)

</comment><comment><USER60> No videos, taking notes in Scapple, searching for the most simple explanation in multiple articles at the same time, implementing what I need as soon as possible.

Focusing if the topic I learn is focused itself or not focusing if it's very broad.

</comment><comment><USER61> I use a mixture of approaches, but w/r/t development I'd say one of the main approaches I use is to just start building something that requires me to learn something new, and then learn as I go. The actual learning is a mix of trial- and-error (in the case of programming), reading books, watching videos, taking classes, reading papers, etc.

For non-development topics (say, math) it's again a mixture of reading books, watching videos, working exercises, etc. And I try to attack problems from multiple angles, by using different books and resources. Just to illustrate with an example:

Last night I started working through _How To Prove It_ by Daniel J. Velleman. I got to the Chapter 1 exercises, and hit a point where I needed to know if a given number was prime or not in order to verify my answer. It was a number larger than the list of primes I have memorized, and I didn't feel like testing all the possible factors by hand, so I just fired up R on my laptop, loaded the matlab library and used the isprime() function.

Later in those same exercises I got to a point where I had an answer, but wasn't sure if it was correct or not, so I just googled until I found a guy's blog where he posted his answers to the same problems. My answer matched his, so I felt fairly confident that it was right (of course, we might have both made the same mistake).

Had I not found that guy's blog, my plan was to post a question to math.stackexchange.com or one of the reddit.com math forums, asking if somebody could verify my answer.

So I started with a book, and eventually used a number of other resources as part of my overall learning experience (a scientific calculator was mixed in there somewhere as well, before I pulled out R).

This might lead one to ask "well, how did you learn R?" First of all, I wouldn't yet rank my R skills very high, but to the extent that I know some R, it was from (again) a mix of sources:

1\. A bunch of Coursera classes, including several of the ones in the Johns Hopkins Data Science track, and the Duke "Probability and Statistics with R" track.

2\. Working through parts of several R books, including _R In Action_ , _Learning R_ , _Using R For Statistics_ , etc.

3\. Trial and error, playing around, using the built-in docs, etc.

That's kinda it. I take notes using pencil and paper, sometimes a plain text file, occasional an OpenOffice Writer document, and sometimes a wiki (I keep a MediaWiki instance running locally).

</comment><comment><USER62> For self-study, I like to dip my toe in the water a few times over a long stretch of time (I've got lots of other things on my plate), and if I decide I'm interested in going further I'll dig into a real project.

</comment><comment><USER63> I read books backwards (by chapter) as the end is where the interesting stuff is. I generally read only the section titles and first sentence or two of paragraphs

I find it helpful to type examples as I read too (for programming stuff)

</comment><comment><USER64> Multiple books, rotating between them relatively quickly (interleaving), usually 20 minutes.

Make anki cards for key points.

If I'm actually dedicating time to studying that's how I do it, haven't had that session in a while though.

</comment><comment><USER65> For programming languages.

1) Read the documentation 2) Sometimes, do a tutorial. 3) Build a small project and ask questions via Twitter/IRC/Slack along the way.

</comment><comment><USER66> I need to write things down myself, then read them over and over. It doesn't work if I read over and over what somebody else wrote.

</comment><comment><USER67>
      def learn(thing, max_time=0, max_attempts=1):

        while run_time < max_time:

          while attempts < max_attempts:

            attempts =+ 1

            if do(thing) = 0

              break

            else

              learn(thing)

Always set a time limit or a maximum number of attempts. Default to at least try (you may already know it).

Edit: I don't write code very much, and certainly don't claim to earn my living on it.

<comment><USER68> Pedantically, aside from the values that are tested without being initialized, with the default values, this always fails at the first test of the outer loop, without making any attempts.

<comment><USER67> Good thing I don't write code for a living.

</comment></comment></comment><comment><USER69> \- pick a topic.

\- find reliable resource/book to read from.

\- read and make notes.

\- refer notes to make things stick.

</comment><comment><USER70> I am a newbie and want to learn angular js, where can i learn angular the easiest way?

</comment><comment><USER71> i use a text (word file) template i made - if you want to see, visit

blondyn.com

</comment><comment><USER72> I use the app I made studysauce.herokuapp.com for memorization. Google calendar for tracking progress and lots of personal analytics. I spend about a day on little set up projects such as connecting to Watson, or adding up calendar events using Google API, or learning the basic of some new framework. I'll do one of these little projects 1 to 4 times per month. Reading other people's research is a good starting point for me. I wish API's weren't so expensive. That is cost prohibitive of my turning a little app I write in a weekend in to a product. No one wants to pay 30 dollars on top of my 20 dollar monthly expense. If my use case ends up costing more than about $5 per month, I try it out and then shut it down. Usually there is no output from my adventures except self-improvement, which is pretty disappointing, I'll admit.</comment>


Ask HN: For repeat applicants to YC, how should you measure the progress? - <AUTHOR> There is a question in the application which talks about the progress you have made. What do you guys think is the best way to approach this? Where I am confused is that the two major things almost all of us have worked on is 1/ Users and 2/ Product. When they are talking about progess, is it the work done/efforts put in, or the numbers/achievements? Or something else?<p>Any thoughts on how to best answer this would be really useful for all the applicants here. <comment><USER2> Measuring progress should display an ability to quantify and communicate value. So, it's up to you to decide which metrics are best for your company / product / project.

</comment><comment><USER3> The amount of work/effort put in will have translated to something that's more easily quantifiable/measurable like growth (what kind differs from company to company), improvement in product or even the team. Agree with tzm -- you probably know best about what metrics you'd want to share in that response</comment>


The Emergence of THE SECOND INTERNET — It's Bigger Than You Think — SecondShares - <AUTHOR> http://www.secondshares.com/2011/03/28/the-emergence-of-the-second-internet-%E2%80%94-it%E2%80%99s-bigger-than-you-think/ <comment><USER2> Here's another article on the topic:

[http://gigaom.com/2011/03/31/the-rise-of-the-second- internet...](http://gigaom.com/2011/03/31/the-rise-of-the-second-internet-and- what-it-means/)</comment>


Show HN: iPhone prank web app in jQuery - <AUTHOR>

Just wanted to get some feedback on this web app I recently made. I had the idea to recreate the iPhone interface in HTML, and when I got that working, I had the idea to turn it into a prank app, making it really easy  to install on someone else's phone without the need of an Apple ID password. In any case, maybe you can save this for April Fools day coming up soon.<p>url: http://www.iphoneception.com <comment><USER2> Nice site design and love the fact that is a web app. I Would like to see more of these experiments.

</comment><comment><USER3> haha love the zombies..

</comment><comment><USER4> This is brilliant!</comment>


The Startup Game: What women want: Celebrity gossip - <AUTHOR> http://blogs.business2.com/startups/2007/06/thousands-of-ma.html <comment><USER2> If we're going to generalize about what different large groups want, I suppose we could look at traffic stats and probably say what men want: pictures of naked women. Probably by orders of magnitude more than all YC startups put together.

<comment><USER3> Your post really judges both women and men in a negative way. In my opinion nothing about enjoying celebrity gossip or porn reflects badly on either gender.

<comment><USER2> My point is only that "what women want" is an awfully broad brush stroke. My wife doesn't want celebrity gossip. I suppose I should have simply said that.

<comment><USER3> I was referring to the way you tried to counter the generalization about women with one you thought was "worse" about men. Your objection to generalizing just seems a bit silly to me. How are we supposed to talk about the entire female gender, one-by-one?

</comment></comment></comment></comment><comment><USER4> Oh, man. I thought women wanted high culture.

Have you ever really observed women (and sometimes men) talk about celebrities. Women talk about Paris Hilton or whatever oddly-crrepy-looking person is "of the moment" as if they were family members or close friends.

"Oh, can you believe that she would..." "And then she said..." "We saw here do that are were _like_ , whatever..."

Etc. Funny how rarely people can recognize how they are being manipulated. Even if typing crap into this blog (sorry, news aggregator) is a faux social activity, at least there's a chance someone will read and respond to me.</comment>


Why I love Node.js - <AUTHOR> https://medium.com/@sakulstra/from-php-to-node-js-meteor-a94d18e6511b#.tstf79c2c <comment><USER2> It's not complicated to love nodejs when you come from PHP…

<comment><USER3> As a former Pythonista who currently likes JS a lot after having used it practically nonstop for the past three years... what do you say to me then?

<comment><USER4> I say... can you show me the light? I love django...it's no bullshit and no frills yet has everything I need. Node.... is hellish. Callbacks haunt me. New tools come out every day. The JS dev process is so over-engineered.

<comment><USER5> Callbacks, arrow code, error handling, and the daily shifting sands of the JS landscape really pained me when I was first getting my bearings with node but I was determined to build a continuous deployment server with it until I was happy with my feature set and comfortable with node. I was going to be building the system no matter what, but I figured it was the best time to learn node and that the async-ness of the language would be a huge benefit (it mostly was).

Eventually, I found my rhythm and I now really like node (it's been three years). It has a lot to do with picking packages that are stable, or at least have responsible leadership, and a modicum of documentation. You get used to minimizing arrow code, and you learn to pass errors until you run into that one obscure darned library that throws them (or leaks them) and you have to write a bunch of stuff to seal it up.

The deployment system runs great, and I really like writing tiny to medium sized worker applications, parsers, scrapers, and web services with node. I find running node in production to be a bit of a chore compared to Python, PHP, and Java- but like all things JS it's evolving and I'm still learning.

</comment></comment></comment></comment><comment><USER6> The last time I criticized Node I was heavily downvoted here (downvotes already started here too! Please educate me, I am here to learn), so I will proceed with caution now:

We developed some applications in Node, it is a headache to maintain an application that uses an SQL database (e.g: MySQL) because the code for executing a transaction involving several queries is unreadable afterwards. We use the module async to have some kind of readability but there are many implicits where small errors are natural to occur.

On the positive side, I found some specific modules in the cryptocurrency space that are not available in other programming languages. This is why we are playing right now with Trireme and Edge.js to use Node modules from Java or .NET.

<comment><USER7> Can you explain?

Due to Node's evented architecture, you should be executing all the transaction code in ONE sql query -- otherwise the transaction can be interleaved with other queries!

<comment><USER6> (downvotes started here too! please educate me instead of downvoting, I am here to learn)

Yes, that is an additional issue that I suppressed for my comment trying to narrow the criticism to executing several SQL queries in a readable and maintainable way.

I will not expand on how we solved that specific issue, just say that the transaction in question is fired by external events that can't be fired until a previous one finished.

But, following your suggestion about executing all the transactions in one SQL query, how do you do this without using a store procedure? Because we were thinking in using store procedures but we couldn't implement all the logic inside the transaction with a SP. This is where other languages solve the problem but I couldn't find a concrete solution in Node, so any suggestions will be very appreciated.

<comment><USER7> I was also worried I'd need stored procedures (which MySQL requires root privileges to create) until I realized (by trying) that felixge's mysql module (and probably others) simply accept queries with multiple statements :-D

So that solved it for me!

<comment><USER5> We did exactly that- create stored procedures- to get around certain transactional issues we were facing. We didn't have any problems being able to create them as we manage the schema outside of the application. In general this has been a fine trade off for us and hasn't caused any pain. I remember way back in the day when using stored procedures is what you were SUPPOSED to be doing...

</comment></comment></comment></comment></comment><comment><USER8> I'm not a big JS guy, but I totally support what this guy is saying here. Use what works for you.

JS is a fine choice for some things. It wouldn't be my preference, but you don't have to make decisions based on my preferences.

<comment><USER9> Most developers don't control their tool-chains. Plus, some tools act like black holes for software. They bend all the infrastructure around themselves and there is no coming back once you cross the adoption event horizon.

<comment><USER10> This is perhaps the best analogy I've read all year!

...and I've read quite a few.

</comment></comment></comment><comment><USER11> JS land is pretty sweet right now: npm is fantastic (particularly on the frontend), ES6 and ES7 finally extend the language to include basic stuff like multiline strings & array.includes(), server-side DOM manipulation makes a bunch of possibilities possible, the post-react virtual DOM libraries are making data binding and components simpler than ever, node and iojs merged, we have an LTS node, I could go on: things are better now than any time in the last 5 years.

<comment><USER12> > npm is fantastic

We must live on different planets. Our eng team and CI tool needs to run npm install multiple times to coerce this lumbering beast into writing all of our requirements into a directory.

Every time it unreliably installs my dependencies as specified (after declaring exact versions required in my package.json) I scream into the void "you had one job!". It's a frequent cause of frustration for me despite providing access to a wonderfully colorful library of software.

Availability of packages on npm and in the larger JS ecosystem is at an all time high and yes, JS as a language seems to be doing well, but npm is, in my opinion, in dire need of some tlc.

<comment><USER11> > Every time it unreliably installs my dependencies as specified (after > declaring exact versions required in my package.json)

Declaring exact versions in your package.json doesn't make installs consistent. An example:

         A's package.json says A needs exactly B version 1.2.0
           B's package.json says B needs C version 2 or newer
             C can be any version.

shrinkwrap will help you with this. It's better in npm v3 (install updates shrinkwrap by default)

<comment><USER12> I'd agree with you but it misses packages at the top level entirely until I run install twice. I am saying install blah@x and it doesn't realize I need it until round 2.

<comment><USER12> Ok thanks for down voting me but see others having the same problem here [https://github.com/npm/npm/issues/10727](https://github.com/npm/npm/issues/10727)

<comment><USER11> FYI it's not me that's downvoting. Your original comment was just 'I know but it still happens' so you may have been downvoted by someone who thought it lacked detail.

</comment></comment></comment></comment></comment></comment><comment><USER13> For toy projects and fast prototyping... JS ecosystem looks awesome but for enterprise grade software it looks like: toy for kinder garden developers.

Mostly cause the enterprise love to support legacy software from 5 years ago (your nice webapp won't work that fast on IE8) and requires minimal support for the next 5 to 8 years.

Web Development future looks fragile IMHO.

<comment><USER14> I'm sure Netflix, PayPal, Walmart, LinkedIn, Uber, New York Times, Medium, IBM are all kinder garden developers.

<comment><USER13> Everyday amazes me that people actually think that when an a "Big Corporation" announces a new technology adoption they actually believe they rewrite everything for that new technology and don't consider it a PR/SnakeOil/Smokeware movement.

<comment><USER14> You do realize these companies have posted blog posts explaining the benefits of them doing just what you say they don't do... PayPal's Mobile.de team blogged about rewriting their Java system in Node.js and how performance was improved and how much faster they can work.

Netflix has also blogged about similar experiences.

Walmart blogged about how they rewrote their site in Node.js and was able to handle traffic on Black Friday way better than with previous systems.

PayPal themselves wrote about rewriting the account dashboard in Node and how it improved things.

This isn't snake oil or a PR movement. These are real companies using Node.js to make their businesses better.

Uber talks about how their whole infrastructure is built on Node.js

IBM bought Strongloop, self proclaimed "The Node.js Company".

<comment><USER15> > was able to handle traffic on Black Friday way better than with previous > systems.

>how it improved things.

> how performance was improved and how much faster they can work.

Do a full rewrite of some ten years old software in any language and it's very likely to be faster. Architecture and software engineering made it faster, not Node. Had they used brainfuck and gotten better perfs, would you have praised brainfuck?

<comment><USER16> You are just speculating and can't possibly claim that the Node played no role in their performance/productivity increase. I'm sure they improved their architecture and fixed mistakes, but they didn't switch to Node for no reason. They could have rewritten in the same language.</comment></comment></comment></comment></comment></comment>