What are some skills (technical or not) you think someone in my situation (or anyone else) should consider acquiring in 2019?
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.
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")?
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.
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?
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.
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)
For those who want to start at post #1, here ya go > https://inquisitivedeveloper.com/lwm-elixir-1/
I’d add to presentation skills: negotiation skills. I’ll recommend Chris Voss’ book “Never Split the Difference” as I have been to all my relatives this Christmas.
This business of exercising for the sake of exercising for the rest of your life as if it is some sort of cross to bear is not the best technique to staying healthy! Try and enjoy it.
Trust me it REALLY depends on the box and the coaches...there's 2 coaches that aren't super helpful, but they're still nice and friendly, but the owner, and 2 of the other coaches are amazing.
At 515, you can't do a ton, so they walked me through modifications, they give me extra help to get better form, they slow me down when I want to push past my limit or feel I'm not progressing fast enough -- so I don't get injured.
Heck, they even call and fb chat w/ me if I miss a class.
I started 9/10 @ 515. It's 12/27 and I'm 430. Goal is be <300 by 2020 (40th birthday).
I can see CrossFit REALLY sucking if quality isn't there, and the coaches suck, I don't like going to classes AS much when the good coaches aren't coaching, so I think that's the difference..
A normal gym you just have equipment, quality doesn't matter that much, in CrossFit --it's all about the people running the place, if they aren't attentive to those who might need extra help getting up to par, then find a different box.
"It is taken as established that the NSCA had a commercial motivation for making the false statement in the Devor Study (…) that the NSCA made the false statement in the Devor Study with the intention of disparaging CrossFit and thereby driving consumers to the NSCA (…) (and) that a loss in CrossFit’s certification revenue was the natural and probable result of the false injury data in the Devor Study."
OP list is the young mans guide to SV future reality if I had to guess.
Never Split the difference from Chris Voss is a good book. Persuasion and negotiation are also as much about effective listening. Something I've practiced hard this year is to be mindful of creating a pause before I respond. Pause for like 2 seconds.
For investing, etc - highly recommend starting with this - https://mebfaber.com/timing-model/
Forget stock picking, it is generally a fool's errand.
Also - Tony Robbins did a good job with his book "Money: Master the game". Look up the "All weather strategy" from Ray Dalio referenced in that book. Diversification across non-correlated assets, compounded over time creates wealth.
As for written communication, Markel's Technical Communication was used in my English class in college and I remember getting a lot out of following its directions. As you might expect, it's very well written. Of course, I had the advantage of classroom instruction, but I think it would be helpful even for self-study.
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 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.
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.
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.
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.
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.
Oh boy have I got news for you :)
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.
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.
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.
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.
"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
Whether 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
Is the book worth reading, in addition? I see very mixed reviews.
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.
I'd start by reading Strunk & White, which nicely addresses clarity and brevity, leaving only a source for expressiveness, which is basically storytelling. There I like the writing books by Steven King, Ray Bradbury, and Ursula LeGuin, but many other worthwhile primers of style are (almost) as good.
Then practice writing while critically reading the best works of good writers, carefully observing their techniques, and then stealing them liberally. Ask friends you trust to assess your work and explain what they liked, didn't like, and why.
The career impact of becoming a better programmer or leader is tiny compared to the impact of moving to a better company.
If you're a free agent and you're not interested in interviewing or working for big companies, then I would say the top skills to learn are listening/negotiation and maybe time management, unless you're already great at those things. Same advice if you're already at one of the best companies and don't need to interview :)
Are you claiming that this practice made you a better programmer overall or just better at interviews?
It isn’t just hackernews hating on the current way of doing programming interviews, it’s a widespread sentiment in the industry. The current way of doing interviews seems both excessive (requires 2 months of practice) and easily games (with 2 months of practice...). Who is winning from this?
Assuming a 25% pay bump, it more or less pays for itself in a year.
Not counting the effect of compounding. Bumps are typically by percent, so every point you chisel out early in your career is valuable.
While I have never had a leetCode style interview, I’ve also far removed from Silicon Valley. That being said, if that’s what my local market required, that’s what I would do.
“The [job] market can stay irrational longer than you can stay solvent”
That kind of future would be very dystopian for the field.
For the record: I see nothing wrong with having a two year degree that spends the first year focusing on algorithms and the basics of computer science and the second year focused on a practical emphasis where graduates can hit the ground running. Whether that be embedded programming, game development, big data, web development, etc.
My first year also included digital logic, computer architecture, and compilers. None of that would help with LeetCode, so get rid of it. My second year in the program consisted of Programming language paradigms, operating systems, data structures, and final year advanced digital logic, advanced computer systems, and an independent capstone project...again, not relevant to LeetCode. I never bothered with the algorithms course (my plate was full, it was an elective) because LeetCode wasn't needed for interviewing back then (but most algorithms don't seem foreign to me either). This was (and still is) a top ten world-ranked CS program.
You could totally master LeetCode taking only a few non-major courses and then augmenting that with math courses. Heck, you could master LeetCode by singularly focusing on mastering LeetCode in a 6 month bootcamp.
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.
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.
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!
1> Learning to learn
From my interactions with some of my friends, I've come to realize that I'm pretty bad at learning, or at being focussed and determined enough to put work into it. I'm not sure how I can correct it, but I've decided to learn at least one skill (like playing guitars, skateboarding, etc.) that requires persistence.
2> Calculus. statistics and some neuroscience
I'm a PhD student and my work primarily focuses on machine learning applications. However I've come to realize that there are too many AI Engineers and very less AI researchers and computational neuroscientists. I feel it's sad that a lot of people are following the hype-train for deep learning, while there is a third-generation neural network (spiking neural networks) that needs more research. Although this has been around for about a decade, the field is still lacking in terms of research. To even contribute a little bit into the field, I would need more knowledge in calculus, statistics and neuroscience (at the very least, about how neurons work). Even if I end up being unable to do research in the field, I still think calculus and stats are very important, so its a win-win anyway.
I've had my own battles with anxiety and depression, and one of the things that has helped keep me at bay even when I had suicidal thoughts was my knowledge about mental health. I could tell myself "this is not right, fight it or get help", because of what I've learned about psychology. I believe that learning psychology can help me better understand myself, my thoughts and my yearnings, as well as that it would give me the ability to understand others who are going though similar (or more difficult) circumstances. On the side, learning "persuasive psychology" can probably help with understanding the effects of different marketing tactics, while also maybe help me deal with difficult people. Other things like cognitive behavior therapy and mindfulness are also things I need to learn, but that would require some help from a therapist.
2) Machine learning and computational neuroscience are two different fields. You really don't need to understand neuroscience to contribute meaningfully to machine learning.
You'd be much better served by studying mathematics like real/complex/functional analysis, abstract algebra, probability, etc.
3) If you've struggled with suicidal thoughts, anxiety, and depression, don't bother waiting to see a therapist. Finding a therapist should be the first thing on your list.
Hope all goes well. Happy new year mate
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.
2. Learn to write deep content.
3. Learn to manage personal finances
4. Learn to invest
5. Learn to draw
6. Learn to sing
7. Learn to have proper 8 hours of sleep
8. Attempt to build a profitable startup again
I think number 8 is probably mutually exclusive with most of the others, especially 7!
A few things that have helped me tremendously as a writer:
1. Volume. There really is something to the idea that going for quantity over quality eventually results in higher quantity and quality. The more you write (and read), the better you get at it. Also, no one churns out consistently great stuff. You may need to write dozens of mediocre pieces to find a great one.
2. Consider hiring an experienced editor to go over a few of your posts. You'll learn a lot in the process.
3. There's a need for "shallow" writing too. You might want to write a WaitByWhy-style 25,000 word post on blockchain, but 1) that's incredibly hard to do, and 2) there's only so many people who want to read that. The audience of people who might want to read a 800 word post on the subject is a lot bigger, and writing a short-but-informative post is its own skill.
4. Why do you want to write? In 10 years, what do you hope to look back and have gotten out of it?
Anyway, keep up the good work :)
In 2019, learn about institutional racism and why we have to undo it. Take a course from the People's Institute. If you haven't learned about this in depth before, be prepared to learn a lot and have your preconceived notions challenged.
I promise you'll walk away with new perspectives and discover a whole new area you can grow and make a difference in.
As you mentioned company decisions have real racial effects, and those decisions are often made by homogeneous teams that lack diversity and perspective.
If anyone wants a recommendation for reading to build up some knowledge about these issues I would recommend reading "White Fragility" by Robin DiAngelo. She does a great job breaking down lots of common misunderstandings white people have about race, and why those misunderstandings are created in the first place.
Contrary to popular belief that you don't need math to do "programming", you actually do need math to progress in said field. Whether you like it or not, Math will be a limitation when it comes to acquiring new knowledge in the computer field. For example, I've been wanting to do Machine Learning for awhile and it just so happened that you need a lot of Math to fully understand it. I've been reading the book "Machine Learning for Humans" and that book is amazing and can't recommend it enough.  They explain complex concepts in ever so simple sentences, but reading through the book, you see formulas and equations that are intimidating to the person that is not used to reading them. I would assume that a math major would have a different and opposite experience.
So yes, more math.
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.
Work on a farm
Do the Appalachian trail (or similar)
Take the train across Australia
Learn to ride a motorcycle
Learn to play guitar
Are these risky endeavors?
UX research methods. Then finding projects/teams you want to work on.
Personally? Thinking about writing a book on SMT solvers, extending jHipster to other languages, doing some high performance SAAS offerings, publishing my semigroup research, my serverless complie optimzation toolchain, and my LLVM based operating system call taint annotation for C++/Rust to get Haskell style IO annotations.
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).
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
Software engineering/programming is somewhat distinct in most fields because you can by some abstraction recreate and scale a thought with high fidelity. In the past, we could transfer or spread thoughts through books or other media. This might've created some sort of mimetic action on the consumer of the media, but it would probably be some corruption of the initial thought of the author. Consider for example, Marx claiming that "what is certain is that I myself am not a Marxist" (not that I am intending to start a political discussion, just to point out that sometimes artists distance themselves from the art). By contrast, a computer program is a thought that is enacted with precision each time it is called. Which is what makes the content of program so philosophically important. Ethics of course becomes paramount because speech is now action in a much more salient way than it ever was before. But the questions of values and of aesthetics should also be considered.
You will probably have to carve out your own fields of study within philosophy and how it relates to computer science beyond the usual accelerationism, trolley car problems, digital physics, etc, but I think it will be well worth it if I'm just giving my two cents here.
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.