Ask HN: What skills to acquire in 2019?
I quit my software development job 4 months ago to take some time to travel, develop some ideas, and improve myself. I have a very flexible schedule, and I'm eager to make the most out of 2019.
What are some skills (technical or not) you think someone in my situation (or anyone else) should consider acquiring in 2019?
193 comments
[ 1.4 ms ] story [ 1445 ms ] threadWhether or not you need them today or not, whether you want to be in a leadership role soon or not, they are essential for anyone seeking to progress and you can’t start too soon.
There are many many ways to approach this and I’ll just offer two book titles that I believe would be beneficial.
1. Start with Why 2. Extreme Ownership
https://www.youtube.com/watch?v=u4ZoJKF_VuA
Is the book worth reading, in addition? I see very mixed reviews.
We need to think about the way we think and talk about the way we talk. I mean reflect on the state of things, instead of blindly increasing shareholder value. We glorify engagement, but we’re arguably glorifying how addictive our creations are.
What if apps maximized for less time spent, like help users just do their work and get on with living life?
When I work on web sites that deliver services I often picture users being in a hurry. People just want to get on with life, not live their lives within my server side rendered single page web app. :)
Today I used an automated delivery booth. At the end it reported in big letters: "you took your order in 2 minutes 12 seconds". Made me vividly remember the end-of-level screen in classic Doom. Maybe that's a good idea: make the session time prominently visible, to have an urge to optimize.
About half the time I was staring at the instruction "the box will unlock now" with the box in question still behind a closed door before trying to pull the door harder.
Short book, yet enlightening on rhetoric. Can recommend, regardless of political affiliation.
I've played with them in the past, but not spent enough time with them to be confident using them in production.
Things I could do in Python in ~10 lines, seem to require at least double in Go.
I'll keep learning it though, I'm sure I'll start to see the benefits soon!
I would recommend machine learning as a very useful skill to acquire.
I have to be more specific because "machine learning", "artificial intelligence", and "data science" are really large topics that can encompass difficult math and PhD research.
For application programmers, I think a very realistic subset is using an existing "machine learning toolkit or API" (e.g. Keras in Python) to analyze data and solve problems. You use the machine learning algorithms but don't necessarily write them from scratch. This level of proficiency only requires high-school math. The analogy would be knowing SQL even though one doesn't write b-tree algorithms from scratch or using the "=PMT()" function in MS Excel without deriving the annuity equation from first principles.
I think machine learning concepts (classification, clustering, etc) will become an expected baseline of programmer knowledge just like SQL was 25 years ago. Its usage will become more pervasive and will be utilized by more people that don't have "data scientist" in their job title.
Oh boy have I got news for you :)
Not trying to be a downer, just my $0.02. For fun? Sure, go for. For career development? You had better be serious and ready to devote the next 5-10 years. I do not at all agree that ML is going to become a baseline skill.
What I think you're missing is that ML is becomeing accessible to organizations WAY outside the sphere you're referring to. In the not-too-distant future, "Bob's Small Engine Repair and Screen Doors" will want to take advantage of ML / Data Science / AI. And it may well be the case that all they need is somebody that can implement Linear Regression or K-Means using SK-Learn, or using a cloud ML API.
And larger organizations will always have room for people with varying levels of skill, especially as demand for the most highly skilled people outstrips the available supply.
and knowing how to throw a classifier together does not in any way mean you're competent and able to solve hard problems.
Not everybody is solving a "hard problem". By way of analogy... if your car has a broken connecting rod, you need to take it to a mechanic who knows how to pull an engine, tear it down, rebuild it from scratch and put everything back together. If you have a bad O2 sensor, that work can be done by somebody much less knowledgeable. If you need the oil changed, that can be done by somebody even less knowledgeable still. Or to use a different analogy, you don't need a neurosurgeon to cut out an ingrown toenail. Use the right person for the job at hand.
What about companies who are not serious about this stuff? There are tons of companies who are not actually trying to solve a hard ML problem. They just want their own recommendation or prediction engines. That doesn't require any deep understanding or 5-10 years in this field.
A ML puritan might say that is not real or serious stuff and this is all fad. That might be true. But I think that is one of the ways someone can start off their 5-10 years journey - working on simpler problems and getting paid.
Electronics is also kind of exciting right now in particular. The open hardware community while in it's infancy still, is growing rapidly. Notably, the ESP32 platform has allowed home brew IoT technology to grow very rapidly as it brings a processor and Wi-fi to a chip for less than $5.
That's an interesting thought. But where would this lead us?
Where can I read more about that? My google searches have not been fruitful.
I believe that company will probably sell the ink by the barrel full for industrial fabricators.
Over the past couple years, I've heard from developers who were very satisfied with Elixir, so I finally sat down and started to learn it.
As I've been learning Elixir, I've been writing a series called "Learn with Me: Elixir" at https://inquisitivedeveloper.com. The idea is that anyone else who's also interested in Elixir can follow along as I learn it and learn it for themselves as well.
Of course, playing around with it has also helped me learn far more than just reading about it. Writing about it has helped me learn a lot better, and my hope is that someone else will also find my writing useful.
For those who want to start at post #1, here ya go > https://inquisitivedeveloper.com/lwm-elixir-1/
1. Programming Elixir by Dave Thomas (https://pragprog.com/book/elixir16/programming-elixir-1-6)
2. Programming Phoenix by Chris McCord, Bruce Tate and José Valim (https://pragprog.com/book/phoenix14/programming-phoenix-1-4)
Can someone help me with two things? Really trying to understand the benefit.
1. When you say "concurrency" do you just mean "handles more users at the same time" or is there something more to concurrency? I keep seeing web chat applications in tutorials for Elixir but chat is such a small application of a technology that I find it hard to believe the majority of Elixir users are building chat systems. What are you using the concurrency for? Why isn't Rails sufficient for that application?
2. Given that most web apps are CRUD, are there any benefits to using Elixir for a typical CRUD website (other than less-than-tangible things like "it's functional")?
Much appreciated!
What Erlang and therefore Elixir gives you is a very sound mental model whereby your communication between nodes and separate workers is done via message passing between Erlang processes (read: not OS processes), and the receiving process may or may not be on the same computer as the sender. Those messages may also be synchronous or asynchronous, depending on what you're doing.
It also gives you a nice mental model for failure. Imagine I'm doing some super big indexing of some alphabetized data. It may make sense to subdivide that work along letter bounds, where some worker does A, another does B, ... etc. Suppose the worker for Q failed. What do you do? You may have to kill the entire job, but you might be able to get away with just repeating Q, or maybe even some subset of Q. But you as the worker that just failed are not in the best position to make that decision, so you fail and let your supervisor know, just like in a large organizational structure. That supervisor may decide the whole job is unrecoverable and fail and let ITS supervisor decide what to do. Erlang/Elixir gives you a toolkit to describe these operations via constructs called GenServers and Supervisors that you organize into what are called "supervision trees".
It also guarantees "fairness" between your jobs. Say you have the letter example, and whatever you're doing, the letter L s taking WAY more time than anyone else. To preserve overall system integrity, the Erlang VM will decide to say "hey man, you're gonna get a chance to finish but I'm gonna let M get some time for a bit and I'll come back to you." This is called "preemptive scheduling". This gives Erlang its "soft real time" properties.
All this to say, you're really setting yourself up to build more complicated systems if you need to. But even if you're not, and you have a typical CRUD app, things like preemptive scheduling are super powerful. Consider a web server. It may make sense to give each request its own process. If you have one that's taking too much time, the system will make sure you're not backing up completely by making sure the next request can run, for at least a little bit.
I'm kind of handwaving details here, but this is the general idea behind these types of systems. Erlang as originally designed was to handle telephony switches and such, and therefore had to handle many different callers all at the same time, on systems with not as much parallelism, and therefore being able to process jobs literally simultaneously, but they needed to ensure that the calls waiting to be connected could connect eventually.
They also designed around being able to hot upgrade your system. If I'm a telephone pole computer, there's no way they're gonna send a guy out to me to upgrade my system, and I want to make sure I can update the computer while it's still servicing the calls coming through it.
Curious to know what the differences are vis-a-vis big data tools like Hadoop or Spark; as a user of those tools I recognized a lot of common failure patterns in the example above. Thanks!
You wouldn't use Erlang/Elixir for doing calculation because that's just not what it's good at. But you might use it as something to manage jobs in a larger distributed system perhaps. Though my suspicion there is you may run into tooling impedance mismatches as you get deeper into the failure modes.
Sorry I can't speak more knowledgeably about that. I'm curious if any WhatsApp folks are around and can comment on if they ever made their Erlang systems talk with their Hadoop/Spark stuff and what that all looked like.
What this functional language does is mask the complexity involved in SMP systems where state and data are subject to races via concurrent access. It also allows you to subscribe to the doomed philosophy of fail once, try again, try harder while ignoring the underlying cause. Trying the same thing over and over while failing has a name associated with it.
It implements a separate scheduler which superimposes it's rules over what ever OS kernel scheduling is in place. Sometimes you don't want that complexity.
It's functional. Who cares about functional as the _only_ model for a programming language?
The tech giants are having massive scandals because they lack it. Whatever you do, be here for the end user. Think about their lives and make it no worse.
Having been on both sides of that coin, being fired and having to fire others, it's clear to me that reducing the amount of pain is important, even if such an act must be done.
If you convinced them to pay you, maybe that money wasn't just pocket change to them. Maybe you sold them a hope for an honest well earned diversion, or something that could make their lives a bit easier or more streamlined or fulfilling. Don't sell out that hope with nagging, annoying up/cross-sells, attempts to addict, or by making the user feel unsafe and paranoid, or by tripping them up with unasked for "innovative" features/UI overhauls or confusing ux.
Given the scale at which our work is deployed, any one of us has the power to unwittingly cause, in aggregate, huge amounts of stress, as if people need any more of that these days.
Excuse the rant, this year my cynicism with a big chunk of our industry has reached a high I couldn't have imagined.
It's sad how dependent the business models of Big Tech are on keeping users ensnared in the services they've simulated digitally. My plumber, my ISP, not even my bank demonstrate the engagement thirst of these megaliths.
https://smile.amazon.com/Index-Card-Personal-Finance-Complic...
https://www.npr.org/sections/alltechconsidered/2016/01/08/46...
Index card the book refers to: https://i.imgur.com/S1sR5Dy.jpg
/r/personalfinance flowchart: https://i.imgur.com/u0ocDRI.png (How to prioritize spending your money)
This describes me, unfortunately. I consider myself fairly smart, did well in college, tons of technical skills, but I am -terrible- with money. I keep a 12-month spreadsheet showing income and expenses for every pay period and one showing current debt, but beyond that I know I’m awful about it. A lot of it comes from my parents also being terrible with money and never teaching me saving vs. spending, investing, etc,. I’ve figured out some of it on my own but I still struggle.
I’m glad to hear you’re trying to teach your children better.
This means that you are not terrible with money. 90% of practical personal finance can be expressed as follows: expenses < income. The rest is implementation details.
Part of that comes from being in a high cost-of-living area with a child and student loan debt, but I also know that a part of it is due to the fact that I buy things I don't need way too often.
Some people find luck with budgets. Don't tyrannize yourself - it's OK to carve out some of your budget for buying things you don't need - but you can balance that with letting yourself save some. And budgets don't have to be 100% set in stone - when my friend wanted some replacement computer parts, he cut back on his food budget (by cooking more instead of eating out) for a bit to "afford" it.
I realize this is easier said than done, though!
Even if you never plan to retire, having a rainy day fund / a long runway will help take the stress out of layoffs, and give you more time to find the job you want vs the job you need to pay the bills, etc. - hopefully helping ensure you keep enjoying working in your current industry :)
I just check it occasionally to make sure my net worth increases month-over-month. Any financial decision like buying a car I take the net income average over time as potential spending bound.
For me it's easier to see "I have A amount coming on B date with C expenses due and D left over for saving or spending" than it is to try and budget monthly and deal with all of the expense carry-over, etc., that Mint tends to do. Maybe I'm doing it wrong but it's a system that, so far, has worked for me for a little over a decade.
People spend an incredible amount of time accumulating capital, but many spend hardly any time learning to properly manage it, relying instead on financial advisers selling commission driven products.
I think that it is often the mentality of trying to "beat the markets" that lead people to make poor financial decisions, when in fact the majority of the population would benefit from taking the time to obtain a fundamental understanding of their own personal finances.
Also maybe beating the market is not that important, but I was making a mistake of accumulating cash without investing it when I was younger. I didn't have spending problems though as I was frugal in my life (though being too frugal was a problem in itself as well).
"the faculty of voluntarily bringing back a wandering attention over and over again is the very root of judgment, character, and will. [...] An education which should improve this faculty would be the education par excellence." - William James
Not necessarily in your workplace, but sure, that too if you're into it.
Mostly I mean community groups of like-minded folks who stay in touch, remain active and do meaningful things together, like speaking up against bad uses of technology in government and law enforcement. Or training people how to get started in tech. Or hacking something together that could be meaningful for the lives of people in a city.
It’s how I’ve felt most useful outside of my day-job, and also how I’ve gained a broader perspective on the culture, values, and practices at other companies.
Also adding on Docker/Kubernetes and ElasticSearch.
Finally, I’ve railed against the need for LeetCode style studying and I haven’t had an interview in almost 20 years that has required it, but I guess I will get back to basics and start working through it.
If you have time off, do something risky that you wouldn't do normally. Why? Because soon enough you'll likely be back in the normal swing of things and unable to take that risk.
Examples:
Work on a farm
Do the Appalachian trail (or similar)
Take the train across Australia
Learn to ride a motorcycle
Learn to play guitar
Etc Etc
Learn to ride a motorcycle
Learn to play guitar
Are these risky endeavors?
If planning on going freelance/solo develop presentation skills. (reading up on stuff like https://www.amazon.com/gp/product/0321668790?ie=UTF8&tag=gar...)
For technical skills, really depends on where your interest and skills are ... look for longterm trends and learn stuff that matches your personality/interests/skills
It's also a great way to learn how complex programs are structured and iterated upon. Games have so many layers of abstractions which are fun to explore :) I'm following the Handmade Hero series which aims to create a production-quality game from scratch - https://handmadehero.org/ - building and engine and all.
Nontechnical skills: practice vipassana and observe a strict, austere hipster diet (preferably plant-based) if you want to not die. Learn how to sustainably live off-grid with zero emissions if you want to not kill the planet. And for God's sake, delete your FANG accounts. All of them.
I’ve tried a few times over the past year to make headway on this and haven’t felt successful, so I’m redoubling and trying to deconstruct the concept a little, figure out some rules and habits to impose on myself, and so on.
I don’t feel confident of success at all, it feels like the defining characteristic of our time is that we’re all walking around with the equivalent of a gram of cocaine in our pockets 24/7.
My working theory is that drastic abstinence oriented solutions are the only way forward.
Any success stories welcome.
You're stuck in these loops through little fault of your own. Our environments are engineered to be very addicting; tech products train our brains to crave a quick hit of stimulus at the slightest hint of boredom.
Trying to fight against this with just willpower alone is an uphill battle. Willpower fluctuates throughout the day, and (supposedly) it is a finite resource per unit of time. You may win a few battles, but the strong cues in your environment remain, and will likely snare you next time around.
It's hard to resist the temptations because they are pleasurable and salient rewards in the here and now, in a way that longer-term, more abstract goals (read a book, stop wasting time on junk info-snacking, etc) can never be.
Ulysses contracts bridge this gap by pulling the longer-term, more abstract goals into the here and now, endowing them with an immediate saliency of their own. Now your new habits can fight on the same ground as your old habits.
Examples: the person who, in trying to quit smoking, gave a friend a check for $5k and promised that if she smoked again, she'd have to report herself to her friend, who would then donate that money to the KKK.
Examples of my own: - I jettisoned caffeine by promising my spouse that for every caffeinated drink I took, I had to give up in proportion something I love dearly (e.g. skip a day of meditation) - I cut down on online boardgaming by promising a friend that I would only play with him -- and should I play with an online stranger, my friend would receive $5k and proceed to squander it at the poker table. (Making the resulting outcome of your contract breach, something that stings, that is visceral and has an emotional valence to it, it key to making the contracts successful).
It also helps to engineer your environment. Remove the cues and temptations. I've had more mixed success with this. But quitting FB, Linkedin, definitely removed strong loops. (My brain fought like hell against their absence, then after the three week mark, never a peep again. Goes to show the arbitrariness of our cravings)
EDIT: I know it's cliched to give technical tricks as answers to comments like this, but these tricks are actually IMHO the best solution to these problems. Trying to enforce through willpower alone seems a losing battle. Eventually the habit fades and you don't need the tricks anymore.
It's worked great for me and doing it in the office has also drastically reduced the amount I use my phone outside of it.
With facebook, I unfollowed all the people and groups and pages, rendering my wall totally empty. Now I can still use it as an actual SOCIAL network - messaging friends on messenger and taking part in/creating events.
With smartphone - I highly recommend turning your display into grayscale. On android, it can be found in developer settings (google how to enable it). Together with high contrast settings, everything is perfectly readable, you can still call and text, take pictures, whatever. But looking at the grey display just doesn't give the satisfaction nice colors do. Try it. Also wristwatch helps, since you don't need to look at the phone to check time.