Why, oh WHY, do those #?@! nutheads use vi? - <AUTHOR> http://www.viemu.com/a-why-vi-vim.html

<comment><USER2> I'm the author of the linked article (and of the ViEmu products). Thank you guys for taking some time to read it.

The funny thing is that having vi/vim editing inside Visual Studio is bringing in new converts:

<http://www.jpboodhoo.com/blog/GettinJiggyWithVIM.aspx>

<http://www.jpboodhoo.com/blog/HookedOnVIM.aspx>

Of course I'm not impartial, but I would recommend you consider giving it a try if you have access to vi, vim, or emulation for them in your IDE (and some time).

I miss having it in Firefox textareas (such as when typing this comment). I don't like using an external text editor for this - integration is everything to me. I'd happily pay for it, and I'm sure others would, too, although of course it's not a big market. Anyone up to the task?

<comment><USER3> First, thank you for writing this article. It's the best explanation I've seen of what vi is all about. I'm pointing several friends at it today to help explain my vim addiction. Your graphical cheat-sheet is also excellent. ([http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial...](http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html) for those following along) When I started learning vim I printed it out and it's still hanging on my cube wall. It really captures a lot of the mnemonics and helped me get up to speed quickly.

I was forcibly introduced to vi when I was doing some system administration on some AIX machines. Emacs was not available and I'm not even sure if something as simple as pico was. Since I was going to be doing a lot of work on these boxes I decided to learn vi. It was one of the best computing decisions I've ever made. I've been using vim for about two years now and everything has just become instinctive. When I'm using another editor I just feel crippled. I still feel like there's a lot I can still learn - I try to pick up a new trick at least once a week.

Here's my current list of tricks from my .vimrc file. I still tweak it but it's pretty stable these days.

      " enable vim goodies
      set nocompatible

      " tab policy: spaces only, 4 per indentation level
      " (company policy, don't flame me)
      " use language-sensitive indentation where available
      " use :retab to fix nonconforming files
      set tabstop=4
      set shiftwidth=4
      set shiftround
      set expandtab
      set smarttab

      " use syntax highlighting
      filetype on
      syntax enable

      " use auto-indentation
      set cindent
      set ai
      set number

      " misc options
      set matchpairs+=<:>  " bounce matching angle brackets on %
      set hidden           " don't kill buffers, just hide them
      set incsearch        " incrementally search (firefox does this too)
      set ignorecase       " ignore capitalization when searching
      set scrolloff=5      " scroll the screen to keep the cursor more than 5 lines in
      set showbreak=\      " display wrapped lines with a leading '\'
      set breakat-=-       " allow wrapping words at '-'
      set linebreak        " allow word wrapping

      " colorscheme desert   " previous favorite colorscheme
      colorscheme vibrantink " current colorscheme borrowed from textmate

      " include arc support (via plugin from the anarki)
      au bufnewfile,bufread   *.arc   set ft=arc

      " show all matching files when expanding wildcards
      set wildmode=longest,list

      " don't display the graphical toolbar (it annoys me)
      set guioptions-=T

      " ********** Custom Keybindings ********************
      " CTRL-k and CTRL-k move the current line up or down
      nmap <silent> <C-j> :m+<CR>
      nmap <silent> <C-k> :m-2<CR>
      imap <silent> <C-j> <C-O>:m+<CR><C-O>
      imap <silent> <C-k> <C-O>:m-2<CR><C-O>

      " backwards-kill-word idea cribbed from Steve Yegge
      " hit CTRL-h (insert and normal mode) to delete the word
      " you are currently typing. It's faster than backspacing.
      nmap <silent> <C-h> ciw
      map! <silent> <C-h> <Esc>ciw

      " hit F1 to toggle match highlighting
      map <F1> :set invhlsearch<CR>

      " linux friendly: paste the current X selection on middle mouse button
      map <S-Insert> <MiddleMouse>
      map! <S-Insert> <MiddleMouse>

      " ************* Load Plugins *****************
      " start matchit
      source $VIMRUNTIME/macros/matchit.vim

      " Toggle the TagList
      nnoremap <silent> <F8> :TlistToggle<CR>
      let Tlist_GainFocus_On_ToggleOpen = 1
      let Tlist_Exit_OnlyWindow = 1
      let Tlist_Use_SingleClick = 1
      let Tlist_Process_File_Always = 1

      " Toggle BufExplorer
      map <F9> \bs
      let g:bufExplorerShowDirectories=0   " Don't show directories.
      let g:bufExplorerSplitBelow=1        " Split new window below current
      let g:bufExplorerSplitHorzSize=0     " Use this many lines for the window
      let g:bufExplorerUseCurrentWindow=1  " Open using current window

<comment><USER2> Thanks for your kind comment! I'm glad the article and cheat sheet are useful and appreciated.

I got started with vi(m) about 3 years ago. I did actually do some development on AIX over 10 years ago (that system looked like a washing machine!), but I didn't get hooked with vi(m) until I really did a lot of development on a laptop with horrible keys:

<http://blog.ngedit.com/2005/06/03/the-vi-input-model/>

Your .vimrc is much more complex than mine! But very nice in any case, I should steal a trick or two from there.

A detail I remember about the AIX system headers: their math.h defined a function called 'class'. I had to do some #defining around that to get them to work with the C++ compiler! It was '96 or so, so they should have taken C++ into account already. Duh. At least it wasn't as horrible as windows.h and its accomplices.

</comment></comment></comment><comment><USER4> This article is excellent. I'm an emacs user, and I know of several articles and books that introduce emacs, but this is the first time that I've ever actually understood how a vi master thinks.

<comment><USER5> Wow, the '.' is certainly an enviable feature.

[http://meghnad.iucaa.ernet.in/intranet/sysadm/help_desk/emac...](http://meghnad.iucaa.ernet.in/intranet/sysadm/help_desk/emacs/49.html) isn't reassuring either. How does C-x (, C-x ), and C-x e compare?

<http://linuxgazette.net/issue47/pedersen.html>

<comment><USER4> The emacs macro features compare _pretty_ well. They're a killer feature of emacs. The editor is named after macros, after all.

You can probably accomplish much of what vi's "." does using emacs macros. The trick is that in emacs you have to notice the opportunity slightly in advance, so that you can hit 'C-x (' and then plan out your macro so that it plays back well on subsequent invocations. You could probably train yourself to think of that more often, after which your emacs experience might be roughly similar to that of the vi user.

But I suspect that vi is better designed for such a macro-intensive style of editing. The beauty of "." appears to be that vi workflow _naturally_ divides into little chunks of action, each of which can then be treated _post facto_ as a macro. This explains my #1 pet peeve as a completely ignorant vi user -- that vi is so damned choppy, always switching in and out of insert mode. That's not a bug, it's a feature! Those little transitions are the waypoints that will later be used to break your workstream into repeatable chunks.

</comment></comment></comment><comment><USER6> Awesome! I've been using vi for about 14 years now and am still learning new shortcuts and ways to harness the power of vi.

I love vi for its combined power and simplicity. It is installed by default on almost every terminal I've ever walked up to, all flavors of nix, BSD, HP-UX, etc. seem to come happily installed with vi ready to go.

<comment><USER7> Man, I agree with the notion of power, but I simply cannot see how anyone could call it simple. The array of keystrokes and their combined meanings is not anywhere near simple, in my opinion.

That said, I would really like to _sit down_ and learn vi sometime.

<comment><USER8> about the longest 'combos' you make are action-move combos, which is 2 keys, and both the actions and move keys do things by themselves. 'w' for example moves to the beginning of the next word. it's a common travel key. 'dd' deletes the current line and is also commonly used. combine them into 'dw' and you delete everything up to the front of next word

so you preface any motion command with an action and you get the intended effect. it's a lot more intuitive than it may look at first. a combo i use a lot is 'cw', which replaces the current word. but when programming this is equivalent to "replace variable." it's things like that (see the 'smart ranges' topic on that link) that make it feel like you're more directly connected with the code, rather than editing it through an interface

<comment><USER7> As I say, I do love the power of it and I'm sure I'd find it somewhat intuitive once I start using it, but it's just a steep learning curve when you can't fall back to input with a mouse.

What I mean is: whenever I start learning a new program, I like to be able to use it like a n00b at first (i.e. click around, use native controls), and then learn the more powerful features.

A good example of this way of learning is the way I use TextMate... every day I learn new controls, and get more proficient and more effective, but I'm not rendered useless (as one would be with vi) if I don't know each and every key combination.

Granted, you can make do with just a few vi commands and be not effective at all, but it's not the same as using a GUI

<comment><USER6> Interesting perspective, I'm wondering if you're a "Gen Y'er" (or whatever they're calling that newfangled generation these days ;)

I ask because I started with PCs before the mouse was really commercialized. My first programs were on Commodore PETs and C64 and my PCjr. (Although I did later buy a mouse for the PCjr, I think it cost close to $200 at Babbages, had to save money for a while for that one...)

My long-winded point being that I "grew up" with a CLI. We edited our text files with edlin (and we liked it, dammit!!). Maybe the folks who didn't get started viewing the mouse as a primary interaction device feel more comfortable with vi, and never really missed the mouse interface.

<comment><USER3> _I'm wondering if you're a "Gen Y'er" (or whatever they're calling that newfangled generation these days ;)_

Apparently the defining starting birth year for that generation is 1982. I happen to have been born that year, and my preferred term for the generation is "Millennials". "Gen Y" over-emphasizes our interaction with the "slacker generation" which preceded us.

Anyway, I don't think that there's much correlation between birth year and vi. With the rise to prominence of Linux and other Unix systems many many budding hackers are starting out with full-fledged command lines and honest-to- goodness Unix. And that's a beautiful thing.

</comment></comment></comment></comment></comment></comment><comment><USER9> My experience with vim started when I got OS X. I had always wanted to learn how to use the terminal on a UNIX machine, and as an extension of that want, I learned to use vim as it was very easy to jump right into it from the terminal.

If there was one word that I could use to describe vim, I would have to say: beautiful.

</comment><comment><USER10> Being a dedicated emacs user, I could only shake my head and sigh as I read this.

<comment><USER11> The first step is admitting you have a problem. You're on the right track.

<comment><USER12> I would love to get into a lengthy discussion about why the One True Editor is superior to vi, but I have a feeling that it would just degenerate into a flame war. vi does have an advantage in that it comes standard on most unix servers, while emacs requires a long (but relatively painless) install.

Let's just say that in terms of power the two are about equal. I think emacs has an edge in the macros/functions department but vi isn't far behind. It's probably also fair to say that either one of them are probably better than a Windows based IDE if you're working with open source software (ruby, php, perl etc).

<comment><USER11> I'm sorry, I can't hear you over the sound of how awesome my text editor is.

</comment></comment></comment></comment><comment><USER13> An oldie but a goodie.

Back when I started working on Unix (early 90s), the only editor on the lab machines vi. The learning curve was horrible, but after that I never was able to use an editor for human beings again.

Nowadays, when I'm trapped in a Notepad derivative, it's all jjjjjjkkkkkkwwwww for the love of God Montesor, give me back my dot!!!

</comment><comment><USER14> Does anyone else resort to writing vi commands down on paper when they are writing in pen or have no eraser for corrections?

</comment><comment><USER15> Is there any article like this specific to lisp? What really turned me on to Emacs was learning about Slime, largely through Marco Baringer's videos (they're linked from this post: <http://bc.tech.coop/blog/050728.html>)

</comment><comment><USER16> The only problem I see with vim is that today I write everything online. In textboxes like the one I use right now to type this text. Maybe we need a firefox extension, that blows up a textarea fullscreen and edits it with vim?

<comment><USER17> Try Mozex.

<comment><USER18> _"... Try Mozex ..."_

Wow I'm editing with it now & it works well. Some observations:

\- It would be nice if it was just concentrated on editing.

\- Certainly a much nicer alternative than the textbox

\- miss the spelling syntax highlighting

\- It doesn't appear to allow you to edit in the textbox after editing :(

\- you need to :wq! & hit enter to save

Can be found at <http://mozex.mozdev.org/development.html>

</comment></comment></comment><comment><USER19> I switched to vim for a few reasons:

\- I didn't want to get trapped into being comfortable with some editor that I would later not have access to. vim will always be there on any unix box

\- there are no showstoppers for vim. Every other editor is great because it has x and y, but the lack of z is annoying. with vim, you can configure it to do almost anything with macros in your .vimrc

\- it was slow to get going at first, but now I find using vim you can edit files much faster than using the mouse.

<comment><USER20> vi might be on any unix box, but not vim.

<comment><USER11> That's true. I'm working on FreeBSD support in our products right now, and every time I type "vi filename", I either get frustrated as hell for the few bits of typing I have to do, or I notice immediately and :q and "vim filename" to get the right thing. Since I'm spawning new instances for each testing cycle (I'm building a product installer) it's a bit of a nuisance to make an alias each time. The default csh shell also pisses me off.

</comment></comment></comment><comment><USER21> Someone should tell them that their "VI Gang Sign" is a pretty close analogue of the Shocker. (Not that that couldn't be a convincing argument to learn vi...)

<comment><USER22> They already know (search for "the Shocker"): <http://blog.ngedit.com/2007/11/19/the-vi-gang-sign/>

</comment></comment><comment> ten-seven Back when I was coding a lot, there were two editors, vi and one other that came with the Unix variant we had. The other "visual" editor had an annoying tendency to convert multiple spaces to tabs if it was able to. This broke formatting and messed up make files. It sparked a holy war against those who "maintained" code with that editor, calling for those people to use vi and stop breaking things.

</comment><comment> meat-eater I work equally well in vi and emacs. Now I've switched from emacs to textmate, but still use vi for editing config files. It's just how I work, vi for config files, another editor for code. Of course, I also use vi to write short scripts on the server. I've been using vi for over 10 years, but this article showed me why it might be a good idea to edit code with it.

</comment><comment><USER23> Why I like vi/vim.

Its always there. Even on tiny linux distros.

It allows me to operate just as fast on _extremely_ high latency connections. It was the only usable editor when I was stuck with 650ms+ latencies on VSAT.

</comment><comment><USER24> hjkl motion is retarded on anything but a qwerty layout :/

<comment><USER25> works just fine on my azerty keyboard....

<comment><USER24> I know, I consider that's in the qwerty group, mind you. Especially since the hjkl keys are at the same place than on qwerty, so your "clever" remark is irrelevant.

</comment></comment></comment><comment><USER26> re: newbies, must be gmail's fault for adopting vi keybindings. e.g. j to navigate down and k to navigate up (in "list view").

<comment><USER27> Google Reader, too.

</comment></comment><comment><USER28> Confession: I use vi because when I was learning how to be a sysadmin (was already a coder) it was recommended -- back then (the '90s) you never knew if emacs was going to be on a system, but vi was practically guaranteed.

I still barely know how to use it, though: my own fault. Laziness prevails. Some of the commands I use because I discovered them by accident (shift-C erases the rest of the line and puts you into edit mode -- I figured that one out because of a typo).

<comment><USER29> Does this mean that nowadays you can expect emacs to be installed on every system? From what I've seen, still no. So basic vi skills are still needed. But nowadays, there are many ways to avoid having to edit files with vi. If a system has sftp access you can mount it's file system via sshfs and edit files from your main machine in emacs. This way you could even have the files version controlled on your main machine. There's also tramp mode of course, but sshfs works better.

<comment><USER3> When you really need vi, you _really_ need it. I'm talking about connecting to servers halfway around the world with the only access being via a serial connection. Straight-up serial console, none of this fancy newfangled terminal emulator nonsense. No amount of emacs and sshfs will help you then.</comment></comment></comment>


"what's the name of the song that goes ha ha ha ha ha ha haaaaaaaaaaaaaaaa?" - <AUTHOR> https://musicfans.stackexchange.com/questions/10865/whats-the-name-of-the-song-that-goes-ha-ha-ha-ha-ha-ha-ha-haaaaaaaaaaaaaaaaa-ha <comment><USER2> Must be Nine Inch Nails piece in Twin Peaks: [https://youtu.be/QczxCxFRUf0?t=110](https://youtu.be/QczxCxFRUf0?t=110)

Posted this answer on SE too.

</comment><comment><USER3> I am sure its this one: [https://www.youtube.com/watch?v=U9t-slLl30E](https://www.youtube.com/watch?v=U9t-slLl30E)

<comment><USER2> Doubt it, the post said "metal" plus "guitars".</comment></comment>


Ask HN: Self-taught webdev with lots of free time. What should I learn? - <AUTHOR> Hey HN,
I'm a self-taught webdev with 10 years xp. I have lots of free time right now with a bit less freelance projects coming in, and I'm getting a bit bored of building web CRUDs and feel like I'm not learning much anymore.
I'm thinking it'd be better to specialize more, but I'm unsure which direction to go. I'm actually selling myself as a full-stack web developer, knowing JS/react/vueJS, PHP/Laravel, bit of design, server management etc.
If possible I'd like a job that can be fully remote or at most 1 day on site, which probably excludes security and high level stuff.
I have lots of time to learn so I'm open to any advice even if it's just to git gud and read SICP.
tl;dr webdev having done every type of CRUD under the sun - what do now
Thanks for your input ! <comment><USER2> Web performance

This is an underappreciated field that lends to plenty of consulting. As the web becomes more complex, with heavy frontend code, third party services, and demanding amounts of images and videos, it's requiring a deeper understanding about networking and browsers to keep the web performant. Compounding the problem is the growing number of users who use mobile devices to browse the web, which have larger constraints on network and hardware than desktop users.

Additionally, web performance speaks to businesses because a "slow" website can impact your bottom line. There's lots of case studies about this: [https://wpostats.com](https://wpostats.com). For large companies with heavily-trafficked websites, this is critical as you're losing potential users/customers as a %.

Google has slowly been making it a bigger objective for websites to focus on SEO-wise, especially with their latest push around "web vitals." Therefore it's becoming a higher priority for marketing departments as well.

Web performance is not sexy and requires a lot of patience around analyzing websites to figure out why they're slow and coming up with specific optimizations for them. This is not like building websites. It's more like debugging. And it requires a pretty deep understanding of how websites load and run in browsers. Provided these things, I think that's partially why it's given so little attention and why so many websites perform terribly. If you're not deterred by these factors, there's a lot of businesses that could use this specialized expertise.

<comment><USER3> I'm working as a webperf guy as a staff. I find the work interesting (although sometimes frustrating), but I'm not sure how many companies want to have full- time perf people onsite. As you mentioned, It's mostly consulting type of work now as far as I can tell (so might not be suitable to everyone), but maybe this will evolve or is already evolving (I've been only approached once for webperf onsite position on LinkedIn in last year, by Atlassian, but maybe because my profile is not that well LinkedIn-optimized).

Anyway, if someone's interested, you can start by reading articles from:

[https://hpbn.co/](https://hpbn.co/)

[https://web.dev/learn/](https://web.dev/learn/)

[https://developer.mozilla.org/en- US/docs/Learn/Performance](https://developer.mozilla.org/en- US/docs/Learn/Performance)

[https://calendar.perfplanet.com/](https://calendar.perfplanet.com/)

[https://csswizardry.com/](https://csswizardry.com/)

[https://phabricator.wikimedia.org/phame/blog/view/7/](https://phabricator.wikimedia.org/phame/blog/view/7/)

And some of my own content:

[https://calendar.perfplanet.com/2018/getting-started-with- we...](https://calendar.perfplanet.com/2018/getting-started-with-web- performance-2019-beginners-guide/)

[https://jakub.gieryluk.net/slides/rivieradev/](https://jakub.gieryluk.net/slides/rivieradev/)

<comment><USER4> This looks really interesting to gain some basic and intermediate knowledge in this field, thanks a lot.

</comment></comment></comment><comment><USER5> I'm a self-taught webdev too and I would strongly recommend learning SQL, not just `SELECT * ...` but really learning it!

I've been digging into postgreSQL and in quite a few applications it's possible to greatly reduce the complexity of the backend by receiving exactly the data you need from the DB. It is so much so that in cases you can even "get rid" of the backend completely (yes, no writing controllers and endpoint, etc.) by using a tool like postgREST (postgres to REST) or Hasura (postgres to graphQL)

Best of luck on your search!

<comment><USER6> Any specific resources to recommend?

<comment><USER5> The postgresql documentation is actually a pretty good start (and finish!).

I like learning by doing something so I took an old side project and I'm making it on PostgreSQL with PostgREST in front of it. It is crazy all the things that the DB can do! Triggers after an actions happens, virtual columns, JWT Tokens, Unit Testing...

<comment><USER7> Using postgrest and combining postgres triggers with Elixir listeners, you can then do callback like actions on the data: [https://blog.lelonek.me/listen- and-notify-postgresql-command...](https://blog.lelonek.me/listen-and-notify- postgresql-commands-in-elixir-187c49597851)

Or do similar using Hasura's Event system but with webhooks.

[https://3factor.app](https://3factor.app)

</comment></comment></comment></comment><comment><USER8> Honestly, in terms of employment you don't need to learn anything at all. Your skillset (which is quite similar to mine) is _highly_ in demand. What you'll probably find is that you can specialise in any of the areas you already have skills in simply by advertising yourself differently.

However, it's always good to learn more. I have a couple of suggestions:

1\. Rust. The Rust book is an excellent introduction to lower-level programming languages, and also to more functional patterns. I went into it from a primarily JS/PHP, and it's been a wonderfully refreshing experience. And it's also been an excellent way to level-up my programming experience.

2\. Embedded programming. Get yourself an Arduino or an ESP32, and make something that connects to the physical world. Lot's of fun. You can technically combined this with Rust, but I'd recommend sticking to C/C++ for embedded work (at least at first) because it's much better supported.

3\. AWS / Kubernetes / Cloud computing. Managing large amounts of infrastructure on these platforms is an art unto itself. And it's worth learning if it's something you have an interest in. I'm not usually a "training" kind of guy, but I'd recommend doing some kind of course / using structured learning materials for this. Because there's so much tribal knowledge that needs to be acquired.

<comment><AUTHOR> By "The Rust Book", do you mean "The Rust Programming Language" ?

<comment><USER8> Yes indeed. The free online version (which has the same content as the printed version) is available here: [https://doc.rust- lang.org/book/](https://doc.rust-lang.org/book/)

<comment><AUTHOR> Thanks. Rust has been recommended a bit in this thread so I'll check it out.

Out of curiosity, what's the appeal of learning Rust ? What kind of projects do you use it for ?

I find that I can solve mostly everything with a blend of PHP/JS, but I also never escaped web CRUDy stuff, and PHP is very well suited for these.

<comment><USER9> It's a general-purpose programming language, so it can be used for most projects. Most problems can be solved with most languages, sure, but rust is fast and "safe", so people flock to it.

It has some nice features. Personally I never found myself besotted with it, in fact I rather dislike it and suggest ada instead. But rust is much more likely to get you a job.

<comment><USER10> Not sure about employability, at least here. A few months ago I searched for Rust job postings in Montreal (a decent-sized tech hub), and the only three results were Morgan Stanley accepting Rust as a "C++ or similar" language, and two listings for professional aircraft painters.

Still playing with it for funsies, though.

<comment><USER9> Maybe not. As I say, I don't use it, but perhaps I'm not so immune to the hype of it as I thought.

</comment></comment></comment></comment></comment></comment></comment><comment><USER11> How about getting back to the basics? You know, taking some maths classes, CS fundamentals, algorithms, data structures, that kind of stuff. It is timeless, and if you are self-taught, I can guarantee you that you have massive holes in your knowledge.

Also, might sound off topic, but learning a new language (not programming, human) could be an amazing step forward, in ways you cannot even imagine now.

<comment><USER12> > and if you are self-taught, I can guarantee you that you have massive holes > in your knowledge

Just curious, why is being self taught a guarantee for having massive holes ? Can you give some likely examples ?

<comment><USER13> I don't know if it's guaranteed, but here's my perspective (as someone with 2 BScs and an MSc, who also self teaches a ton of stuff):

My personal drive for self-teaching generally stems from either a specific problem I'm trying to solve on a project or a desire to dig deep into something "cool" I've come across.

In the first case, I'm tugging on the strings that seem most likely to get me to the solution to the problem I'm trying to solve. There's a bit of backtracking here and there as I choose dead end paths, but it's usually a depth first traversal. I'm not trying to learn all of a field, I'm just looking at what I need to know to move past the hurdle I've encountered.

In the second case, the goal is different but the process is pretty similar. When I'm learning for fun there is usually a bit more breadth, since I'm not trying to solve a specific problem in the immediate future, but I'm also probably not building a robust implementation of anything. I'll usually end up with a decent surface level understanding of a topic; this is useful in that, if I encounter a related problem in my work, I've got at least the concept in my mental toolbox already and can do a deep dive more easily.

Over time I've built up a pretty wide and deep understanding of a lot of things as I've built them, but I am also fully aware there a ton of gaps (and have a big topic list that I occasionally visit during a slow period).

<comment><USER14> Well said. I can relate to this as self taught. I don't work in the SE field though so I feel no need to learn the silly whiteboard interview puzzles. It's never been a hindrance to making my ideas come to life.

<comment><USER13> Heh, the closest I've come to "silly whiteboard interview puzzles" was back in undergrad competing in the ACM Programming Competition stuff. Our team made it to regionals a few times, but we never really took it all that seriously.

</comment></comment></comment></comment></comment><comment><USER15> Have you considered open-source development? [1]

All the languages and libraries you've listed are open-source projects started by someone like yourself.

> _" having done every type of CRUD under the sun - what do now"_

You have a lot of experience developing CRUD, why not build something that alleviates the pain of CRUDdy development. What annoys you? What sucks and could be done better?

Anyway, just a thought. Good luck to whatever you do.

[1] [https://i.imgur.com/qr7Sr8B.png](https://i.imgur.com/qr7Sr8B.png)

<comment><AUTHOR> I'm far from being good enough to contribute to open-source projects unfortunately. I can make lots of things work but I don't know enough advanced patterns and low-level stuff to contribute in a meaningful and maintainable way.

<comment><USER16> What better way to learn then?

<comment><USER17> This. I think it's pretty good practice to check out what's going on under the hood in libraries you use, or plan to. Sometimes you find interesting libraries or techiques, things you could improve and in rare instances that you need to stop using it...

</comment></comment></comment></comment><comment><USER18> I found that learning and writing some Clojure and Go made me think better about the code I was writing in my main language (python).

I enjoyed working through Clojure for the brave and true: [https://www.braveclojure.com/clojure-for-the-brave-and- true/](https://www.braveclojure.com/clojure-for-the-brave-and-true/)

and the go tour is probably the best introduction I've ever had to a language: [https://tour.golang.org/welcome/1](https://tour.golang.org/welcome/1)

<comment><USER19> I can imagine the impact Clojure had; learning about Lisp had a big impact on my programming journey.

What was it about Go that made your Python code better, though?

<comment><USER18> Go helped me learn about designing good interfaces, and how to write tests using dependency injection rather than just patching stuff out.

</comment></comment></comment><comment><USER20> It seems you are good at building web CRUDs, but complains it is boring. It is boring because it is repetitive. Create a web CRUD builder. Computers are there to cope with repetitive tasks. You can put your expertise in the builder. You will continue to earn money by selling web CRUDs, but you should take your art to a higher level. Repetitive tasks are an opportunity to increase abstraction (like in SICP) and write smart programs. Try to find your ikigai.

<comment><USER17> To expand on that, if what you are doing is simple crud, it might be possible to completely ditch the backend and use [https://hasura.io/](https://hasura.io/) and talk to it directly using graphql. It can also generate typescript definitions which is another suggestion I was going to make. Using it made some parts of js more obvious and gave me a lot of confidence working with it.

</comment></comment><comment><USER21> You could take some time to familiarize yourself with Docker and how to deploy a full-stack application as a set of "microservices" that talk to each other. It's really helpful for getting closer to understanding infrastructure, scaling, and deployment.

You could familiarize yourself with some crypto things like running a Bitcoin node and maybe Lightning (Bitcoin's layer 2), and then figuring out how to deploy it or build a website that uses your node to accept payments for you or on behalf of others.

You could start a side project that uses both, such as a blogging platform that lets users publish articles that can be unlocked with a crypto payment rather than a subscription or credit cards. You could use both containers and Lightning to do it and learn both at the same time.

<comment><USER22> This is definitely what I would do if I had lots of free time!

</comment></comment><comment><USER23> I read this book. [https://www.amazon.com/Designing-Data-Intensive- Applications...](https://www.amazon.com/Designing-Data-Intensive-Applications- Reliable-Maintainable/dp/1449373321)

And it was really enlightening. I would heavily recommend it. It starts off by teaching different types of implementations of different parts of DBMS. Then goes on to teaching about how distributed systems deal with various problems.

<comment><USER24> i'm a mobile application developer aspiring to learn backend. will this be a good read for me if i have negligible experience on server side of things?

<comment><USER25> You would definitely benefit from doing general backend side projects and reading before reading this book. I don't think you'll have enough context for it otherwise.

However, the book is definitely relevant to mobile applications. The backends for all the most popular apps are built with systems described in it.

<comment><USER24> thanks for the suggestion.

</comment></comment></comment></comment><comment><USER26> I'm not sure if this scratches an itch for you, but I would learn more about business via the route of launching a small side-hustle. By having skin in the game, you'll learn a lot about product trade-offs, marketing, selling, etc.

In the best case, you get a profitable side hustle going for yourself (and increase your financial independence). Worst case, you go to your next programming job with a ton of extra skills and insights that have excellent commercial value in the workplace.

I recorded a few videos showing the big picture of my first side hustle (code + marketing) and these might make it concrete and real for you: [https://www.semicolonandsons.com/episode/Bird's-Eye-View- of-...](https://www.semicolonandsons.com/episode/Bird's-Eye-View-of-a- Profitable-Web-App)

</comment><comment><USER27> Suggestion: Dig in to the very bottom of your computing stack and get a working knowledge of your CPU, bootloader, OS kernel, system libraries, etc.

Along the way, you will want to try: \- Using a debugger to step through simple programs at the machine level and see what happens to the registers, stack, etc \- Using tracing tools like strace (for Linux) to see what syscalls various programs issue (this is after you learn what syscalls are and how your OS handles them) \- Playing some old-school hacking wargames like vortex, utumno, etc. These are fun and really make you learn the low-level details of how your OS loads binaries, memory layout of processes, etc.

Most developers don't know this level of the stack, and when you are the one guy on the team who does, it's a bit like having superpowers.

<comment><AUTHOR> Do you recommend any books / courses that could help give me some sort of curriculum around this knowledge ?

I unfortunately don't know what I don't know, so I'd need a bit of guidance to learn efficiently. Something like [http://pages.cs.wisc.edu/~remzi/OSTEP/](http://pages.cs.wisc.edu/~remzi/OSTEP/) maybe ?

<comment><USER28> I really loved this book: [https://www.amazon.com/Code-Language-Computer- Hardware-Softw...](https://www.amazon.com/Code-Language-Computer-Hardware- Software/dp/0735611319)

Which goes from bits on up without shying away from circuit diagrams. It's also really well written and you can read it from start to finish.

It puts it in a historical context too which makes it fun to read.

Once you read that, they'll be fewer unknown unknowns.

<comment><USER27> This is a far better idea than "Operating Systems: Three Easy Pieces" as suggested by the OP.

</comment></comment></comment></comment><comment><USER29> You could learn python/machine learning.

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

There are a bunch of guides like the coursera course I mentioned and on youtube there is the official tensorflow channel also!

[https://www.youtube.com/channel/UC0rqucBdTuFTjJiefW5t-IQ](https://www.youtube.com/channel/UC0rqucBdTuFTjJiefW5t-IQ)

<comment><USER30> I second this. With Webdev + Machine Learning skills, you could build interesting products.

I give you an example from my life. I build PredictSalary ([https://predictsalary.com](https://predictsalary.com)), a browser extension to predict salary range from job opportunities which don't disclose salary range.

A browser extension is basically a bunch of JS files injected to web pages. If you know webdev (frontend), you are set to build a browser extension. All you need to learn are machine learning and deep learning. You don't need to dive deep (unless you want to). In my case, basically I just use basic regression to predict salary range.

</comment></comment><comment><USER31> I'll suggest something different,

leetcode.com

seriously. it will give you a lot of confidence with algorithms and DS. You'll be able to look under the hood of many webdev/data frameworks.

hey it might even give a higher paying gig ;) , but don't worry about that.

</comment><comment><USER32> Entrepreneurship? Getting more technical has a diminishing ROI after 10 years.

Or something completely orthogonal to computing. Something you enjoy. For fun.

<comment><USER12> > Entrepreneurship? Getting more technical has a diminishing ROI after 10 > years.

Does anyone do anything just for the hell of it anymore, or is it all driven by money?

<comment><USER33> I'm driven by money because everything is getting more and more expensive :)

</comment></comment></comment><comment><USER34> Learn C. Then maybe one of the newer systems languages like rust, zig, D, nim, etc. If you're bored with CRUD, there's a whole other (bigger) world to explore when you get a little closer to the metal. It's tremendously empowering and fun as hell to get you're hands dirty a bit, so to speak. You'll also become a better and more employable programmer as a nice side effect.

<comment><AUTHOR> C or C++ ? Thought about it, at the very least it would make me a bit more well-rounded.

<comment><USER35> You should learn C. Life is too short to struggle with C++ now that we have better alternatives such as Rust.

You can also ignore the people who ignore the complexity of web apps. Classic C programs are very often much simpler than full web apps IMHO.

<comment><USER36> Modern C++ is fairly easy to learn. At-least easier than either Rust or C.

<comment><USER37> I personally don't think this is true. I worked a lot with C++ before and I'm still confused by the syntax and logic behind some concepts like (just randomly selecting some links from the dynamic memory group).

[https://en.cppreference.com/w/cpp/types/remove_extent](https://en.cppreference.com/w/cpp/types/remove_extent) [https://en.cppreference.com/w/cpp/memory/shared_ptr](https://en.cppreference.com/w/cpp/memory/shared_ptr) [https://en.cppreference.com/w/cpp/memory/polymorphic_allocat...](https://en.cppreference.com/w/cpp/memory/polymorphic_allocator)

I think the basics that are similar to other languages (data types, basic pointers, basic references, classes and OOP) are indeed easy to learn as they are basically the same in most programming languages, but the more specific memory management and weird syntax around some standard libraries make it harder to learn, use and read. Let's be hoest, correct C++ code usually looks ugly and verbose.

<comment><USER36> shared_ptr is fairly understandable at-least from an application developers usage point of view.

std::remove_extent is only used for template metaprogramming and generally in linear algebra libraries. polymorphic_allocator is an expert facility.

Apart from shared_ptr, the other two are for very specialised purposes - 99.9999% of all C++ code ever written will never have them. But if you need them, you can leverage them.

I came from high level languages (JS/Java) and I found modern C++ pretty good - wow I can code native!. I found writing in plain C very difficult and laborious. I found Rust conceptually far more difficult than C++. Also you can't take your traditional data structures and write them in Rust. You have to do it the special Rust way, which makes it a plain when you are just trying to follow the code/pseudocode in a paper.

Admittedly, the Rust compiler catches pretty much _everything_ you do wrong. But I code C++ with all warnings treated as errors along with static code analysers and they catch all my mistakes too.

</comment></comment></comment></comment></comment></comment><comment><USER38> Try functtional programming using ramda.js to step up your js skills; try putting up a prom & grafana stack for monitoring, try using something like django & drf for your APIs (django is somewhat a large web dev market & is really solid, DRF will make you go lighting speed on your dev, it will also step up your permissions programming skills) ; work up to 100% coverage with unit tests and then write e2e tests that reflects the specs, ElasticSearch is a valuable tool to know as well (for logging or be it to use it as a search engine for one of your projects) - get 100% score on web.dev, do not use any css template and actually master it (all that flux / grid system is still a mess for me) (use variables etc..., maybe even scss or sass to be able to loop and whatnot) ; the list could be lot longer but one thing i learnt is that iterating on architecture is a lot more beneficial than spitting out features

<comment><USER38> Oh and if by any chance you are not efficient with linux & docker do it !!!!!!

</comment></comment><comment><USER39> Hey,

Let's meet up online and play hackthebox.eu together for a bit. My idea is to simply pick a live box and hack it together. You can pick the difficulty. I've done 6 years of CS degree programs (1 bachelor, 2 masters), 1.5 years of software engineering experience and done security courses (network security, hardware security and reverse engineering) as extracurricular subjects.

Anyone who feels up for the challenge, my email is in my profile.

<comment> 52-6F-62 Seems like something in signup is broken. Every code I get back fails.

edit: Scratch that. Took about 5 or 6 codes to finally work for some reason.

</comment></comment><comment><USER40> Get into security, specifically web app security pentesting.

You'll thank me later.

<comment><AUTHOR> This and the servers/linux stuff is the most interesting part of my job. I do have my doubts about being able to get into it since I suppose you really have to master low level dev (which I don't) and I don't think I can get a job as self-taught in this field.

<comment><USER40> Why not try it out by start messing around with it and get a feel for it? But to answer your question: no, you don't. You already have more than enough prerequisites for an easier transition.

[https://pentesterlab.com](https://pentesterlab.com)

[https://portswigger.net/web-security](https://portswigger.net/web-security)

Have fun!

Edit: I'm completely self-taught and I've been working in the field for a few years. No dev or even IT background prior to getting into network pentesting and web app pentesting.

<comment><AUTHOR> Neat, thanks for the advice. Pentesting got a spot on mr. learning list's wild ride.

</comment></comment></comment></comment><comment><USER41> If you're not already well-versed: get familiar with Google Analytics, Google Tag Manager, Funnels, a/b Testing etc. It's cool to know other tools as well, but privacy concerns or not, GA + GTM are the default. They're largely underused, but my experience is that clients love it when you can set it up for them, especially in combination with Adsense/Adwords to optimize their campaigns.

</comment><comment><USER42> Why not try something very different outside of programming? Such as learning to play an instrument, a foreign language, Jiu Jitsu etc. In the long run, such offbeat pursuits have a multiplier effect.

<comment><USER43> I learned Banjo a few years ago while freelancing. The trick is to hang it right next to your desk. You'll play it way more and keep playing it as a nice break (vs watching youtube videos).

</comment></comment><comment><USER44> Learn web3.js and build dapps. You already have most of the requisite skills under your belt.

<comment><USER45> I haven't encountered any dapps yet that are useful in day-to-day life.

Are there any popular or important ones you could recommend?

<comment><USER21> Compound, dYdX, crypto kitties, uniswap, Dai, Lightning network, Augur...

These are mostly financial apps. Compound for example provides the ability to earn decent interest rates (currently ~2-6%) in a time of 0.1% at banks. That's definitely important for people taking it seriously and using it to grow real savings. It's not a joke or a toy, it's used for real investments.

Lightning is helping Bitcoin become more usable. dYdX, uniswap, and dai are important infrastructure for the crypto economy. Cryptokitties is a game that is not important but is popular. Augur gives insight about the future.

</comment></comment></comment><comment><USER46> How is your knowledge of regular expressions?

Spending a few days to learn them well² is really worth it.

\--

² it's also worthwhile to know how they are working under the hood if you want to write high-performance regular expressions

<comment><AUTHOR> I love them and went through [https://regexcrossword.com/](https://regexcrossword.com/) for fun, they're great tools.

I have no idea how they work under the hood though !

<comment><USER47> Knowing how they work under the hood will help you to write better expressions that perform well and don't waste performance.

</comment></comment></comment><comment><USER48> Best way is to build your product. A real world product. There only you will be able to confront upon the wall of Reality .... Even the lightest simplest product is the best tool to really learn, as you confront, think, invent, try and errors everything.

Languages have no meaning if there are not tested in real space. I lost a lot of karma here because of discussion on PHP (I am a ruby guy). But at the end you can keep and relie on PHP, because until you don't see yourselve flaws, then those flaws doesn't really exist. And only then you choose your language that will correct problem the right way ;)

After your product is done, show it to us here, return to HN and expose your vision, and receive rewards and critics at the same time.

</comment><comment><USER49> Please learn how to actually make money off web development and let me know how you do it. I've noticed a huge disconnect between what people think a web dev can/should make and what I've been able to get from it.

<comment><USER50> 100% self-taught here. I change $150/hr for full stack Rails work and none of my clients have batted an eye at that. I'm thinking about raising my rates, actually.

If you know what you're doing, I can assure you, making money is not going to be one if your problems.

<comment><USER49> Wow, I must be a complete idiot with this stuff because I can't get people to give me even 150 bucks for a full website right now. How do you actually get these 150/hr clients? Please don't tell me I need to work in Silicon Valley for some years and get the "contacts", cause I don't want to live in the US anymore. Tell you what, here's my site: [https://www.andeswebdesign.com](https://www.andeswebdesign.com), if you like it, just send me all your work and I'll do the whole site for you for an hour of your pay. I also have a PhD in computational and applied mathematics if you want to put some real deal data science pipeline in it! I've never made a cent off of that PhD either, so maybe you're the guy who breaks it all open for me.

<comment><USER51> I think your contact form is broken, or I just sent you like 8 messages trying this in a few different browsers.

<comment><USER49> I don't doubt it, we just redid everything last night. Please give it a shot later, I'll go fix it.

EDIT: it's redeploying right now. Please send me a email at erdos4d at gmail if you are actually trying to get in touch with me for business and not just testing the form. Thanks.

</comment></comment></comment></comment></comment><comment><USER52> Try to get maximum Google Lighthouse scores. Get into functional programming and useful patterns (e.g. state machines). Try a TDD side project and get a feeling about test coverage. Maybe develop a view about next gen tools / compilers like SvelteJs. There aren't too many people who're able to write a well structured and maintainable, secure high performance web app with a high test coverage.

Career cheat: If well known open source projects merge your code, that's worth a lot!!111

</comment><comment><USER53> Mobile or desktop dev (not Electron or React Native). See how the other half lives.

Last I checked Apple TV recommends a markup+JavaScript development process for standard TV streaming applications. It's not a web environment, but it should feel pretty familiar. Easy transition, knock out a demo app and you could start pulling contracts for that, maybe. Dunno how hot that market is.

I'd second others with leveling up with SQL. Maybe also dig into esoteric or advanced uses of HTTP daemon software, Redis, et c.

<comment><USER54> Any specific resources you recommmend for learning react

<comment><USER53> Well I wrote _not_ React Native for mobile dev, but I'm the wrong person to ask in any case. I learn best by starting a project with something I'm totally unfamiliar with and just... going. In fact I find learning other ways almost intolerably dull and am unable to stay focused, when it comes to computer stuff (other topics, I don't have that problem). So from _my_ perspective, the answer to "how best do I learn this computer thing?" is going to be "just start a project—ideally one that pays" about 95% of the time. Or pick a simple-enough-looking but not-dead project in the tech on GitHub and start contributing.

I gather other people like reading docs (OK, that's alright) or tech books (ugh) or watching videos (double ugh) or listening to podcasts (triple ugh) to learn computer things. I almost never do most of that (aside from consulting docs), _especially_ not when first approaching something. I am, therefore, just about the worst person to ask about resources for learning any computer thing.

My only suggestions other than that would be to use Create React App, because the alternative is the sheer cosmic horror or a complex JavaScript build, and that goes at least _double_ if you're doing React Native rather than browser- targeted React, and to start a React project with TypeScript because without it JavaScript is kinda miserable, and there's little reason not to.

</comment></comment></comment><comment><USER55> Beside SQL which is strongly recommended, it's good for you to know static typings, java and c# comes to mind (haven't tried go, anyone can recommend it or other suitable)

<comment><USER56> TypeScript is the obvious choice for an experienced webdev. It's worth spending extensive time on to get good. Learn generics and advanced types to the point of not needing to look things up.

<comment><USER55> I need to mention that though TS is good, it's static typing is optional so op may find it different with java or csharp

<comment><USER56> Setting noImplicitAny should be adequate to address that. Java is getting type inference soon too.

</comment></comment></comment></comment><comment><USER57> Great time to read some books if you haven't already.

\- Mythical Man-Month

\- Design Patterns

\- Code Complete

</comment><comment><USER58> Try writing an operating system in rust [https://os.phil- opp.com/](https://os.phil-opp.com/)

</comment><comment><USER59> Besides all kind of data science/machine learning, what about learning the "greybeard" mastering of Unix servers? This will connect a lot of old-grown idioms (think about daemons, classical TCP services, etc.) and get you a lot of knowledge in networking (which has connections to event-based networking and thus asyncio, greenlets and all that).

<comment><AUTHOR> That's probably the most interesting part of my job ! Making some small scripts, managing the build step, servers etc.

Although I'm not sure you can get this kind of job as a self-taught dev with no degree/certifications.

<comment><USER60> Absolutely you can. Just build up some real experience. Some certifications help as well. Just be careful the ones you spend time and money on.

</comment></comment></comment><comment><USER61> DevOps, SRE, CloudOps. Things are starting to trend where full stack jobs requires knowing how to build (usually with containers) and deploy (usually into a PaaS) your application.

How do you manage a build pipeline, how do you provision appliances in a cloud provider, how do you monitor your applications if shit goes wrong, etc.

<comment><USER60> Based on his responses elsewhere here, it looks like Ops / Admin oriented things would be his groove.

<comment><AUTHOR> Indeed, that's what I took away from reading the answers !

This thread has been a great help, I'm thankful for each response.

</comment></comment></comment><comment><USER62> If you haven't done any functional programming I can recommend this course:

[https://www.coursera.org/learn/progfun1](https://www.coursera.org/learn/progfun1)

The techniques you learn there will transfer to javascript and make you a better web developer.

</comment><comment><AUTHOR> Thanks for all the great answers, they all helped me think about what I wanted to go for.

I'll be focusing on linux admin / devops / security and brush up on the parts I've missed (computer science basics / SQL / C...)

I welcome every course / book / resource advice !

</comment><comment><USER63> Hi fellow self-taught web-dev with (almost) a decade of experience.

Since we have no formal education we need/want to constantly learn new things in our free time. This is both fun and can be very impactful.

Learning for us is a habit, or even kind of an obsession, but we should always look at topics with a pragmatic eye too.

All of the things I list here helped me do a better job (qualitatively) in some way or another. This is an incomplete list but hopefully you find something useful in here.

In the past:

\- SICP => fell in love with Lisp and started to "get" what programming is about. Hard to explain.

\- canvas, SVG => out of necessity at the time, pushed me down a rabbit hole of linear algebra. If you touch GUIs then a solid understanding of these concepts is multiplying your productivity and ability.

\- Go, programming language => first I didn't have a use-case for it. Glad I learned it because it sparked a strong interest in learning languages. Every next language was incrementally easier to learn.

\- theoretical computer science, algorithms and data structures => these concepts are typically taught in CS/IT courses. They are incredibly powerful, important and timeless. Some of the most practical and powerful concepts for web-dev: complexity analysis, graph data structures, FSMs.

In the more recent past:

\- Clojure => I have a strong appreciation for data-driven, functional programming and REPL driven development now. These concepts fit very well into web-dev.

\- SQL in depth => especially temporal data-modeling. I started asking questions like: Can I do this in pure SQL instead? The result is a much higher appreciation for the language and a more productive approach for both backend design and programming.

\- Regex in depth => a nice data-driven approach to handling strings, ubiquitous and practical.

\- writing a compiler => this blew my mind. everything is a compiler...

Currently:

\- Rust (and WASM) => I wrote a little automation tool with it so far and hope/expect that the language will become empowering even in web-dev.

On the horizon:

\- Julia => I hope to dive deeper into math and linear algebra specifically in a practical way, also I assume that some data-science (specifically analysis) concepts help me to develop better solutions and broaden my horizon. I my goal is to use Julia as a vehicle for this.

\- WebRTC, video/audio streaming

\- WebGL => I want to dive deeper into graphics programming

<comment><AUTHOR> Nice, that's really interesting ! How did you touch so many different languages, was it only on personal side-projects or did you learn on the job ?

I'm afraid learning too many different languages just for fun would be detrimental on my main "job" language, like I'd forget the main patterns. But probably not.

<comment><USER63> > How did you touch so many different languages, was it only on personal side- > projects or did you learn on the job ?

Mostly in my free time yes. But I've also written tools I use in my job now. With Clojure I've written a data integration/migration tool that I use directly in the REPL. In Rust a small automation tool that fetches some APIs and puts the data into a PDF (because the document has to be printed and signed by hand).

> I'm afraid learning too many different languages just for fun would be > detrimental on my main "job" language, like I'd forget the main patterns. > But probably not.

I get the feeling but it is _completely_ the other way around. You get a better understanding of languages and programming in general and many concepts are language agnostic. The next you thing you learn gets easier because you know what questions to ask.

Learning Clojure helped me write better JS, you can even compile it to JS and integrate it into a JS application as well.

Rust teaches me to write better imperative code. Allocation and lifetimes for example are language agnostic concepts once you see behind the abstractions. Also with WASM you get to use Rust from other languages like JS and even PHP.

Tips/opinion:

\- I don't learn a new language that doesn't challenge me in some qualitative new way. For example if you know Java, there is no point in learning C# in depth except you are looking for a specific job. You can almost always directly translate Java concepts to C# concepts and be fine.

\- I prefer learning a new language that also lets you do a thing you couldn't do before. For example tapping into a new runtime/community/mindset. Or doing things way faster, or dynamic. Or interacting with a set of libraries that have a different reach.

\- Languages itself are not the most important thing. It is what they carry around that is interesting and useful.

\- I also prefer learning languages that have some useful interoperability with the ones I already use. The ones I mentioned above are in this category. Another big one would be C. Not a strict rule though.

\- As I mentioned: SQL and Regex are probably the most important languages to learn and get a deeper understanding of as a web-dev.

</comment></comment></comment><comment><USER64> A different perspective on the server-side of things might be useful. Could either go lighter like Firebase, or thicker like Rails/Ruby, Django/Python, Phoenix/Elixir, or Yii/PHP. They have more structure and let you tune things differently.

Certainly being exposed to working in a functional style with immutable data can benefit your thinking even when using common languages. I prefer the static type-inference flavors, e.g. F#, OCaml, or Haskell which is a bit more of a stretch. SICP/Scheme is great or even playing around with Clojure.

</comment><comment><USER60> What are your goals in life?

<comment><AUTHOR> Job-wise I'd love to find something more technical and less business/project oriented. I find myself not really caring about the end product but I love focusing on how things work.

I've often been the only one enjoying debugging since it's more of a brain teaser than a business/product focus. Also the build/deploy part of dev interests me a lot.

Also gotta get to a scratch golf handicap, but that's outside scope.

<comment><USER65> Ever tried following the « from nand to tetris » curriculum ?

I knew a few people (including myself) who dream of taking a few months off just to complete that course.

<comment><AUTHOR> Funny you should mention it, I'm 3 chapters deep in nand to tetris on coursera. It's a great course.

</comment></comment></comment></comment><comment><USER66> I'd expand on one of your best skills you already have. The "stack" gets more and more complicated so "full stack" will stop to be a thing in the future.

If you are already good in react, learn more libraries / frameworks in that ecosystem and increase your day rate. You are a frontend architect now.

I'd start with things like nextjs, Gatsby or Redux saga.

You could also go into the devops side of Frontend. Learn the different approaches of deploying / scaling a Frontend with server-side rendering (vercel, digital Ocean, docker...)

<comment><AUTHOR> Build / Deploy / Scaling is the most interesting part of my job right now, so it makes sense to focus on this part. Thanks !

</comment></comment><comment><USER67> Please Contact Me! I have lots of mini projects that need done, you will be contributing to open source projects that will help expand my service offerings. You can reach me through my profile.

Thanks!

<comment><USER68> I couldn't find some contact or email.

</comment></comment><comment><USER69> I'm surprised by a lot of the suggestions (learn C?). I mean sure, everything is interesting, but what is the goal here.

There are many paths, I suspect you could use more exploration to know which ones appeal to you.

From my pov: \- general backend people are a dime a dozen, deep front end expertise is harder to find. if you already have front end skills, adding deeper design/UX skills to that would take you to another level completely \- on the backend, python unlocks a giant data / ML ecosystem, plus django

<comment><AUTHOR> Well, my post was kinda generic and more exploratory so I appreciate every answer.

I've read every post and realized I'd like to focus on back-end, specifically server management / devops / security.

</comment></comment><comment><USER70> Project Euler is also always nice to learn more things about math.

</comment><comment><USER71> No shortage of great suggestions here. Lotsa knowledge pouring in!

So I'm there with you although not quite as extensive.

May I suggestion: mobile app? I'm just now trying to get into PWA using vue. I have quite few mobile ideas and trying to pick your fav child is hard ;-) But using a bit of Biz Intel, research is pointing me to certain direction.

Also why not make it side hustle? Check out indiehackers.com (I have no affiliation). Great motivation and inspiration.

</comment><comment><USER72> Learn about Test-Driven Development and Software Design. Or learn about Software Design and Test-Driven Development. You'll learn that they are both ends of the same stick.

</comment><comment><USER73> I'd suggest having a look at IoT, chances are you already have the skill set to work with IoT and the demand will only grow in the following years.

</comment><comment><USER74> I was in the same situation. I have done CRUDs for years and finally got longer projects (2 years). I am now facing much more techy problems : recommandation engine, OCR, search engine, simple geographical functions, etc.

It is much more fun, also much more complicated.

My first take would be to learn ElasticSearch, to get a new superpower (it is how it felt to me) and compliment your CRUD expertise. My 2 cents.

</comment><comment><USER75> Auth and API Security. Lots of apps fall apart when time comes to add login and data persistence!

Also, Jupyter Notebook is really cool, and it would be awesome to have Web Assembly versions that work in the browser. Colab is a nice UX, Binder, Thebelab, all steps in the right direction. Feels like notebook computing with WASM is under explored key infra for AI

</comment><comment><USER76> Do you often use asynchronous tasks? If not you could use RabbitMQ or Redis (etc) and try to use queues, workers, or pub/sub. Maybe tying that to a websocket.

If you want to expand from PHP you can look up Go or Python. If you want to try something very different and fun but with less prospect for a job try Elixir.

You can also update your skill to the new Vue3.

</comment><comment><USER77> > specialize more

With how rapidly the web changes, I would consider specialization a wart on your resume. Web developers have to be generalists. I'd keep doing what you are doing: learning new things.

I'd learn some other back-end language. C#, Java and Rust come to mind. You're very strongly tied to the scripting/dynamic ecosystem.

</comment><comment><USER78> There's another thread at the moment about touch typing. I think that's only 'meh' useful. Instead, how about spending time on getting all the hotkey combos of your favourite IDE or editor into your muscle memory?

If it has a presentation mode, then also learning how to use any of the features of that would be a nice plus.

</comment><comment><USER79> You have all the skills needed to succeed in a technical level. Maybe look into expanding your expertise in sales, marketing, or running a business.

If that doesn't float your boat then I suggest getting into woodworking with hand tools.

My point is that you don't need to spend all your time focused on tech skill development - you might burn out on it.

</comment><comment><USER80> Web assembly is going to change everything. Rust compiles to web assembly, maybe start there with single page apps as a start.

Smart contracts. Writing a smart contract is pretty easy. They use web front ends to work. Bringing quality UX/UI to crypto may be a skill that'll open doors for you.

</comment><comment><USER81> Starting an independent project or two in an area you haven't played in before might be both fun and useful. I have a somewhat long list of ideas I don't have the time to do if you're looking for inspiration -- feel free to email me if you want 'em (soham at soh dot am).

</comment><comment><USER82> You can consider building SaaS product around your expertise , for eg you can sell APIs. But ofcourse doing market research is another domain. But if you start with an audience, and their problem, you might hit it off. ROI is exponential with a successful SaaS product.

</comment><comment><USER83> I'm a bit biased since I run a Kubernetes training platform, but even basic Kubernetes knowledge will allow you to deploy all sorts of architectures with a few YAML files without having to patch several external services together

</comment><comment><USER84> Security. It's an in demand field right now, and I just don't see how it will become irrelevant in any time in the future.

React, Angular, etc will all be passe in a few years. Don't base your career on fleeting technologies.

</comment><comment><USER70> I quit webdev after 3 years and I'm now trying more and more thing in the gaming world. Mostly cpp and opengl. Emscripten(was) and WebGL are very nice to make shiny doodles. So maybe try one of those. Or make simple art with css.

<comment><AUTHOR> Were you able to get a job or freelance gigs in the gaming field ?

<comment><USER70> I'm still studying Computing science right now and will start with a master in Game Technology next year. But it is really hard to get a job or do freelance work in the gaming field so no not yet but hopefully soon TM.

</comment></comment></comment><comment><USER85> Rust, Terraform, Kubernetes - or at least, that's my focus and bet for the future

</comment><comment><USER43> React Native if you don't already know that. Also UX and Product Management. Then just launch some little thing to real users. It will be a thrill ride.

Of course I'm projecting what interests me but that's my advice.

</comment><comment><USER86> I think you should take a look at Flutter for mobile dev.

[https://flutter.dev/](https://flutter.dev/) would be a good starting point if that sounds interesting to you.

</comment><comment><USER87> learn sql. no matter what else you do, sql will be with you sooner or later.

read your favorite DBMS manual end to end. this could amount to thousands of pages; each one is well worth it.

watch leslie lamport's TLA+ videos.

</comment><comment><USER3> I'm asking myself the same question. WebAssembly (WASM) looks like something that might have some potential for the future, but adoption will be probably slow/limited.

</comment><comment><USER88> Learn Kubernetes and/or learn a programming language that has a hot market and static types like Kotlin(if you into more webdev) or Rust(if you into systems programming).

</comment><comment><USER89> SICP is a great thing to pursue. Pick an area of interest outside webdev and pursue it. Try learning about systems or low-level programming. The field is vast.

</comment><comment><USER90> System orchestration (docker/kubernetes/aws/...)

This falls a bit under dev-ops and sysadmin but it would unlock your brain to think in different ways.

</comment><comment><USER91> Discrete Mathematics

</comment><comment><USER92> Try XgeneCloud : [https://github.com/xgenecloud/xgenecloud](https://github.com/xgenecloud/xgenecloud) \- its free & open source.

With XgeneCloud,

* You can generate REST/GraphQL APIs instantly on any database (MySQL, PG, MSSQL, SQLite)

* And deploy entire backend into a single Serverless function! (AWS Lambda, GCP CLoud fn, Azure Function Compute)

* Has a built in GUI tool for Database design and API debugging as well.

Idea is you get to pass the boring bits (CRUD et al) and invest time into business parts of application.

(Disclaimer : Im the creator)

</comment><comment><USER67> Contact me! I have work that needs to be done. You will contribute to open source projects and will help my company expand its services.

</comment><comment><USER93> I'm also a mostly self-taught freelance webdev, and recently I've been learning about Rust which I've found to be very interesting.

<comment><AUTHOR> What kind of projects are you taking on with Rust ?

<comment><USER94> not op, but there was a post today about how to build single page apps using Rust on the front page: [http://www.sheshbabu.com/posts/rust-wasm-yew-single- page-app...](http://www.sheshbabu.com/posts/rust-wasm-yew-single-page- application/)

<comment><USER93> I read that one too with great interest. I'm still only learning and reading, though. I'm hoping someday I'll be able to use Rust in some professional capacity, but for now it's just to have fun and play with something new.

<comment><USER94> Same here. I started going through the excellent guide a few weeks ago.

</comment></comment></comment></comment></comment><comment><USER95> I think containers, orchestration, nomad. Apps in the cloud decouple storage, security. The real "app" is an ephemeral container

</comment><comment><USER96> What about WASM?

</comment><comment><USER97> I started Computer Science last week. Math is awesome, learning Calculus slowly. A decade after normal people do.

<comment><AUTHOR> How's it going ?

I'll be starting as well, feels like I'm too late to the party. Won't stop me though.

</comment></comment><comment><USER98> Very few webdevs know it, but they should all learn it, with a gun to their head if necessary: restraint.

</comment><comment><USER99> Get a Laracasts subscription. They have courses on lots of web dev topics. Not just Laravel/php.

</comment><comment><USER100> Update your skills, php is hard to market, learn python or rails, that would have high roi

<comment><AUTHOR> PHP is used a lot in France where I'm based, so that probably differs a bit from the US market.

<comment><USER101> However, the market will eventually change and it's better to be prepared. Plus with PHP being the mainstream I wouldn't be surprised if you could make better $$$ by going after the (still) relatively niche technologies.

</comment></comment></comment><comment><USER102> i love these ask HNs...they are always full of such good resources i never knew i needed

<comment><AUTHOR> Yeah, I never expected so many good answers.

</comment></comment><comment><USER103> Artistic side - color wheels, photography, design, typography.

</comment><comment><USER104> Where are you based?

<comment><AUTHOR> I'm based in France.

</comment></comment><comment><USER105> algorithms and data structures, prepare for interviews at larger companies that follow more traditional CS interview practices.

</comment><comment><USER106> Rust, WASM, Vue, Hasura, API Integration

</comment><comment><USER107> TL;DR: There's probably not an obvious, "learn this and you'll increase your job prospects" technology for you at this point. But, you can also decide to learn almost anything, and because of your years of experience, open up a ton of new doors.

I'm also a self-taught engineer (well, I've done course work now, but only years after starting in the field).

If I'm reading this right, I think you're in a position where there's not an obvious next thing to study, as you've more or less become an expert in CRUD applications.

I think a lot of developers hit this point, especially us self-taught types. When you're making your way in the industry, it's really easy to notice the in-demand skills/technologies that you don't have, and to add them to your toolkit one at a time. It's a nice, linear progression. Then, you reach a point where that approach doesn't work anymore. If you're a 10+ year developer who knows React and Vue and is strong with vanilla JS, adding Angular to your toolbox won't raise your salary or your skills—you could probably pick it up on the fly if you really needed to.

I think at this point, you need a paradigm shift away from "what is the market pulling me to do" and "what do I want to do." It sounds like you want to stay an IC, so that means it's going probably going to be purely technical—so what technology do you find interesting?

For me it was machine learning, and then hardware-level stuff. That's what lead me to take university classes and study higher math/more fundamental CS. There wasn't an obvious pull in that direction from the market—none of my bosses offered me a raise if I became an ML engineer—but I liked it, and because I had years of experience already, becoming proficient in the field opened up an entire new world of opportunities in terms of career and personal life. I wasn't a new grad who studied ML. I was a career developer who'd built businesses, who now had a background in ML. You could apply this same logic to any new field you study, it doesn't even have to be technical. If you got really into design, you'd be a designer with 10 years of development experience. If you got really into sales, a salesperson with 10 years of dev experience is a hot prospect at any company that sells to engineers (in other words, some of the most valuable companies on Earth).

If you want to stay in web development and level up there, I'd recommend following the advice of many on this post. Pick a part of the stack you find interesting, and dig a thousand layers down. Even better, if you find something you think could be done better than the standard tooling does it, build something there.

<comment><USER108> This is a great reply. Reminds me of this post "How to Become the Best in the World at Something": [https://forge.medium.com/how-to-become-the-best-in-the- world...](https://forge.medium.com/how-to-become-the-best-in-the-world-at- something-f1b658f93428)

</comment></comment><comment><USER109> Puff up your LinkedIn, Github, etc

</comment><comment><USER110> Soft skills.

<comment><USER111> Under the broad heading of soft skills you could learn how to spell and become a better writer. Most technical people aren't good communicators so taking a course in composition and storytelling would put you in better standing compared to most.

</comment></comment><comment><USER112> Why not mentor?

<comment><USER113> I second that idea. You can learn a lot about your field from trying to make people understand it.

</comment></comment><comment><USER114> WebAssembly

<comment><USER115> any resources you can recommend?

</comment></comment><comment><USER116> learn the language `webppl`

</comment><comment><USER117> Svelte !

</comment><comment><USER118> play with SwiftUI!

</comment><comment><USER119> Web 3.0

<comment><AUTHOR> But is it webscale ?</comment></comment>


References to corona virus were added to his blog post on pandemics this year - <AUTHOR> https://twitter.com/jwiechers/status/1264953956758884354 <comment><USER2> A better title would have been appreciated. Not clear who "his" is initially.</comment>


Swedish statistician Hans Rosling dies from pancreatic cancer - <AUTHOR> http://www.thelocal.se/20170207/swedish-statistician-hans-rosling-dies-from-pancreatic-cancer <comment><AUTHOR> dupe

discussed here: [https://news.ycombinator.com/item?id=13590123](https://news.ycombinator.com/item?id=13590123)</comment>


When Polymorphism Fails - <AUTHOR> http://sites.google.com/site/steveyegge2/when-polymorphism-fails <comment><USER2> "In case you're (somewhat) unfamiliar with OOP terminology, polymorphism is a pretentious name for the concept of late binding."

Actually, they are two related, but different concepts. Polymorphism generally refers to <http://en.wikipedia.org/wiki/Subtype_polymorphism> but there are other types. In short, it involves virtualizing an interface. Late binding, aka "Dynamic Binding", on the other hand, makes no assumption of an interface and does not necessarily imply polymorphic behavior.

<comment><USER3> Excellent point there are many types of polymorhism (hehe) ad hoc, subtype etc.

As a functional programmer when I hear polymorphism I default to parametric polymorphism. This guy is not talking about polymorphism at all but instead the limitation of late binding via dyanmic/single dispatch.

<comment><USER4>
         As a functional programmer when I hear polymorphism I
         default to parametric polymorphism. This guy is not
         talking about polymorphism at all but instead the
         limitation of late binding via dyanmic/single dispatch.

It doesn't matter what type of polymorphism you're referring to, all it matters is what polymorphism does ... the ability of a certain piece of code to run with any data types provided they implement some kind of contract.

Late binding / runtime dispatching is giving you an implicit polymorphism that's more powerful that all those types you mentioned since the contract is also implicit.

You are right that Stevey talks about the limitations of single-dispatching. Multimethods are designed precisely for the problem he describes.

Multimethods are very powerful, problem is they come with great runtime penalty and there aren't too many use-cases for multimethods.

Otherwise, because in both Python and Ruby you can override the dispatching mechanism and generate code at runtime, you can add multimethods to them.

For example in Python you can use the "peak.rules" package: <http://pypi.python.org/pypi/PEAK-Rules>

Then you don't need to add methods to every possible Callee type, you just add a multimethod on (Caller, Callee) + a generic one on (Caller, object) which returns a default for unknown cases.

It's cleaner because you can add that multimethod anywhere (either in the Caller's package or in the Callee's package) and it also doesn't break encapsulation, and without the runtime penalty I would prefer it to a big switch ... simply because you might not have the ability to modify the Caller's package.

</comment></comment></comment><comment><USER5> In the example with monsters, perhaps the issue is that all the different monster types are classes instead of data. For instance, I would instead implement something like

      class Monster
        attr_reader :type
        def initialize(type, likes = {})
          @type = type
          @likes = likes
        end

        def likes?(x)
          @likes[x.type]
        end
      end

      orc = Monster.new(:orc)
      troll = Monster.new(:troll)
      elf = Monster.new(:elf)
      elf_maiden = Monster.new(:elf_maiden, :elf => true)

      puts troll.likes?(elf)
      puts elf_maiden.likes?(elf)

If you have 150 subclasses, it is a code smell in the first place, and perhaps by addressing the root problem, issues like the one Steve mentions won't occur in the first place.

<comment><USER6> I believe this solution is somewhat implied, yet not spelled out, in the summary:

> It's a separate essay, but I think this implies that type is best > represented via properties rather than classes, because of the inherent > inflexibility of classes.

It is rather unfortunate that the article switches from a self-admitted unsatisfactorily solved monster example into a completely different example.

</comment></comment><comment><USER7> In more general terms, what OOP is meant for and what it handles perfectly is exposing functionality of an isolated data structure. When, however, it comes to interaction between separate objects OOP poses dilemmas like those described in the post.

As a classical example, when you define a basic API for a graphical object you usually have no doubt on where and how to define draw(), getBoundingRectangle() etc. as long as the methods operate within the object, i.e. use the properties of one isolated object. Doubts arise though when it comes to things like removing a child object from its parent, for example. Should it be parent.removeChild(child) or child.removeFromParent()? Or both? Or perhaps environment.remove(parent, child)?

And Steve's authentication example is probably the most compelling one. How can you trust a polymorphic call to visitor.hasMachineGun()?

So yes: " _It's not the way things work in the real world, and OOP is supposed to model the world._ " The world is not just objects, it's also interaction and interoperability that makes it an interesting place.

</comment><comment><USER8> The gem of the article was the articulation of "an object's type is the union of its class and properties". That's how it is, I just hadn't seen it in writing before. It also strikes a chord with what I felt bad about in his examples: nothing really helps if your game has 150 monster classes.

You could attack from the outside by putting the method in Elf class and overloading by the parameters:

        public boolean doesElfLikeIt ( Elf mon ) { ... }
        public boolean doesElfLikeIt ( Orc mon ) { ... }
        public boolean doesElfLikeIt ( Monster mon ) { ... } // default

if your language can do that. Otherwise you'll have to do it manually, i.e. threatening little children with switch statements. But classes are amorphic, it's like trying to reshape glass that's once burned. Having a single Monster class and codifying its type mostly in its properties (which themselves may be instances of other classes) seems like a much better way.

</comment><comment><USER9> This is called the Expression Problem (<http://en.wikipedia.org/wiki/Expression_Problem>). Once you have a program, you want to be able to extend it in multiple ways: adding new classes or adding new methods to every class. In Haskell this is sometimes solved using attribute grammars. They are very similar to aspect-oriented programming, which is another way to solve the problem.

I have seen both AG's and AOP used. Sometimes it is a very elegant solution (for example, when writing a compiler), but it can also quickly lead to messy code.

<comment><USER10> > adding new classes or adding new methods to every class

Common Lisp lets you do both. These are not problems with polymorphism, these are problems with brain-damaged implementations of polymorphism.

</comment></comment><comment><USER11> Agree with pwim that 150 subclasses is way too many. OO Principal Favor Composition over Inheritance easily kicks in here. But even with fewer subclasses we still have to define the likes/dislikes of N monsters with N-1 other monsters. Further, every time a new monster is added, N monsters like/dislike logic has to be updated.

Maybe we are looking at the system/problem from the wrong perspective?

Maybe the likes/dislikes between monsters isn't actually so arbitrary. Perhaps, it is the characteristics of one monster that other monsters don't like or do like. If this is the case (which makes sense as in the real world we judge other things based on characteristics and behavior), then the like/dislike behavior can be encapsulated.

Further, using something like Strategy pattern, you can come up with a set of algorithms that define the likes/dislikes between monsters. That way you can compose that specific behavior of a monster at run-time further reducing your class count.

</comment><comment><USER12> The Expression Problem strikes again!

There's a guy giving a good lecture on it: [http://professor- fish.blogspot.com/2010/08/lecture-series-on...](http://professor- fish.blogspot.com/2010/08/lecture-series-on-advanced-functional.html) (I think he even has a solution in Haskell)

<comment><USER13> It seems like half the papers ever written about Haskell contain a solution to this problem... This includes most papers about monads and monad transformers.

</comment></comment><comment><USER14> > But it's the true polymorphic approach, right?

Wrong. I guess that's the end of this article. You don't add a method to a type in every case some other type wants to know something about it.

</comment><comment><USER15>
      class Creature
        def doesElfLikeMe; false; end

        # or
        def method_missing(*a)
          if a.first.to_s =~ /LikeMe$/
            false
          else
            super
          end
        end
      end

      class Orc < Creature; end
      class ElfMaiden < Creature; def doesElfLikeMe; true; end; end
      # Orc.new.doesElfLikeMe # -> false
      # ElfMaiden.new.doesElfLikeMe # -> true

</comment><comment><USER16> anyone care to comment on whether multiple dispatch or multimethods (e.g., in CLOS) solves this problem more elegantly?

<comment><USER3> I only skimmed the article but it looks like he is more or less talking about the expression problem brought up by Philip Wadler some time ago. Definitely multiple dispatch can solve this problem but if we stick to the original definition of the problem it breaks on the requirement for static type safety (which probably doesn't matter to you heh).

GADTs in haskell and I think Scala can solve this cleanly. Active Patterns in F# may also provide a clean solution for the full problem.

<comment><USER17> Yes, you can solve it quite simply with an active pattern, or type union. The fundamental problem with the problem is that it's a relational problem and polymorphism largely solves hierarchical problems. This type of problem also solves easily in prolog. The solution to the problem in java is to create some kind of relation class that abstracts the state of the relationship to between individuals/groups.</comment></comment></comment>


Is fat killing you, or is sugar? - <AUTHOR> http://www.newyorker.com/magazine/2017/04/03/is-fat-killing-you-or-is-sugar <comment><USER2> I moved to a ketogenic diet on January 9th of this year. I weighed 318 pounds. As of this morning I weigh 282 pounds. That's 36 pounds lost - 11.3% of my body mass - in 77 days, and I have not yet changed my nearly non-existent exercise habits.

My goal is to get 80% of my calories from fat, no more than 20% from protein, and to consume a maximum of 20g of carbs per day. I intend for this to be my diet going forward; this is not something I am doing temporarily to lose weight.

I've done a good deal of research on this topic, and my conclusion is that the human body is not equipped to deal with the massive amounts of simple carbohydrates that it gets in today's world.

<comment><USER3> Do you find that you have to put more effort into cooking / eating with the new diet?

<comment><USER2> At least initially, absolutely. It completely changed the way my wife and I shopped and we all but stopped eating out.

After a month or so it seems to have leveled out. We collected a dozen or so recipes we liked and were easy to make, and we knew what we could and could not get at restaurants.

At this point, the net effect is that we spend more money on food, eat at home more often, and often order modified meals at restaurants (e.g. chicken fajitas, but instead of tortillas, rice, and beans we'll just have guacamole).

</comment></comment></comment><comment><USER4> I don't know if it's fat or sugar that's killing us. I lost 50 pounds just eating balanced, healthy, nutritious meals. I reduce my sugar intake but didn't eliminate it. In fact I stuck to my twice weekly energy drinks and occasional candy bars and milkshakes. However my meals were regimented to include protein, vegetables, very rarely bread, rarely cheese, stopped drinking milk, and cooked everything at home from scratch. Less eating out. The only thing I truly eliminated from my diet was packaged foods, and highly processed meals in a box. So no more Cheeseburger Macaroni. So really, maybe, it's not sugar and fat, it may just be the highly processed cheap foods, microwaved stuff, etc.

<comment><USER5> Is eating out really that bad? Restaurants cook so much better than me. I know fast food is bad, but a salad or steak? Don't make me give up my restaurants!

<comment><USER6> > Restaurants cook so much better than me.

It depends on what you mean by 'better'. Taste better, or nutritiously better.

My friend here in San Francisco runs a Pakistani-"Indian" restaurant on Jackson St, and during Christmas week I helped him out in the kitchen as his staff was thin (just moving food in and out to customers' tables, taking back dishes etc, no cooking)

This may not be the case at all restaurants, but I was pretty horrified at how the average restaurant around the corner operates. They put loads of salt, cream and butter in everything. Vegetables and meats are purchased in bulk from restaurant supply stores and are rarely fresh. If a customer didn't like an entree, they'd just make a new one with more salt, cream (if applicable) and butter. They have 4.5 star average reviews on YELP. Always packed on lunch hour and evenings during the week.

In his (Owner / my friend's )own words "Anything can be made to taste great if you throw in salt and butter".

Some Indian restaurant use oil and a dash of butter even in their Basmati rice!

<comment><USER5> Still, not talking carbs or sugar right? The old 'fats are bad' and 'salt is bad' legend dies hard. They are really our savior if moving from carbs to veg and meat.

<comment><USER4> Oh, animal, definitely animal.

</comment></comment></comment></comment></comment><comment><USER7> What if it's not simply too much sugar, but rather too much sugar combined with too little exercise?

<comment><USER8> Sugar is a major problem as right now it gets pumped in almost every food. It is addictive and people are more likely to re-buy those products.

If you think you are avoiding sugar in your diet by avoiding the usual culprit (processed juices, soda, desserts), think again. Now sugar is being injected into everything, processed meat, soups, etc...

I just bought some Jerkey at Trader's Joe. Each serving contains 10-11 grams of protein and, 5 or 6 grams of sugar. That's one teaspoon and a half of sugar! A packet, ( a normal snack), has 3-4 servings, and you end up with 5+ teaspoons of sugar that if you didn't look at the nutritional labels you wouldn't know. Normally jerkey shouldn't have any, (or maybe one gram and best).

This is just one example, but the pumping of sugar is becoming so pervasive that it is almost impossible to avoid.

<comment><USER9> I recently checked the sugar content in some Prego pasta sauce. It was something like 50+ grams of sugar in a smaller size jar (depending on the variety of the sauce). When I did the math, the sauce was contributing 25-30 grams of sugar per meal - similar to a can of soda. I found another sauce with 1/3 the sugar content at my grocery store. (And of course, pasta is not the thing to eat if you're looking for low carbs, but the point stands)

There has been tons of advertising about the health benefits of cereals, but cereal has tons of sugar. Honey Nut Cheerios have 10g of sugar per serving. Corn flakes have 8g per serving. Frosted Flakes have 11g. Some of the few low sugar varieties are Kix, Cheerios, and Rice Krispies. Even then, the added milk will have 10g of sugar.</comment></comment></comment>