Below is a sample of the emails you can expect to receive when signed up to NCZOnline.
|
Your first-Tuesday-of-the-month guide to being a better, more well-rounded software engineer...plus updates on how I''m spending my time. Hand-crafted for you.
Of all the JavaScript-related technologies that have popped up in the past few years, WebAssembly is still the one that seems to confuse people the most. I get asked fairly frequently, "should I learn WebAssembly?" The answer to this question isn''t a simple "yes" or "no" because people often aren''t clear on what it means to "learn WebAssembly." Confused yet? Let me try to clear things up.
The best description of WebAssembly comes directly from the website:
WebAssembly (abbreviated Wasm) is a binary instruction format for a stack-based virtual machine. Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server applications.
The most important part of that description is the phrase "compilation target," which means you''ll ship WebAssembly as the last part of your process, not the first part. As a compilation target, WebAssembly isn''t intended to be hand-written, and so you will never have to learn to write WebAssembly.You might write your code in Rust, or Go, or TypeScript, and maybe one day pure JavaScript, but you are unlikely to ever have to write WebAssembly by hand.
What else is important to know about WebAssembly? It''s designed to have predictable performance. JavaScript performance can vary wildly depending on how you write your code, and therefore, which optimizations the JavaScript engine ends up applying. WebAssembly is designed so all optimizations available inside the JavaScript engine will be applied. That means that the fastest JavaScript has the same performance as WebAssembly, but again, it''s hard to please the JavaScript engine with hand-written JavaScript. For that reason, where performance is important (such as in games), WebAssembly makes a lot more sense than JavaScript.
So should you learn WebAssembly? The answer is yes. You should understand what WebAssembly is and that it can be a better option than JavaScript for performance-intensive applications. You should know that type-safe languages can be compiled to WebAssembly and used in web browsers and Node.js. And most of all, you should be aware that at some point in your career, you''ll likely end up using WebAssembly as part of building a web application.
This past month, I read three books:
This month I did a little bit of exploration around Google Cloud Run and TypeScript:
Also, I''m just two sponsors away from releasing part 5 of my Creating JavaScript promises from scratch blog post series. As a reminder, I''m releasing a new post for every 5 additional sponsors I''ve received since part 4 was released. So far I''ve released four posts:
The next post will cover Promise.race() and Promise.any(). So if you''ve enjoyed this series so far and you''d like to see it continue, please consider sponsoring me on GitHub.
About you: You're familiar with Angular and Python, maybe even Django, and have worked with systems built on AWS. You are security-minded, organized, and patient with your colleagues. You're excited about guiding a small company to the next level and you're interested to learn how foundations, endowments and family offices make sense of the $B investments they manage across asset classes. Learn more.
About you: You''re familiar with Node.js, Vue, TypeScript, DBT, Postgres, Kubernetes, GCP services and/or Figma to solve problems across the stack. You thoughtfully balance product velocity with best practices for engineering, security and design. You are excited about joining as a founding (second) engineer to help make the lives of engineering teams more productive and happy with a customer-first approach. Learn more.
Have a full-stack or front-end job you''d like to post on the newsletter? Reply to this email for more information.
You can reply directly to this email to let me know what you thought of this newsletter or if you have ideas for future newsletters.
Unsubscribe | Update your profile
Human Who Codes LLC, 113 Cherry St #92768, Seattle, WA 98104-2205
Photo by Andrej Lisakov on Unsplash
Your first-Tuesday-of-the-month guide to being a better, more well-rounded software engineer...plus updates on how I''m spending my time. Hand-crafted for you.
Last month, I had a phone call with a former colleague. We were talking about what they were up to at work when they used a technical term I didn''t know. It was clear from the context that they expected I knew what it meant, but I didn''t. At that point, I was faced with a decision: do I stop and ask what the term means (and thus put my ignorance on display) or keep quiet and hope that the term wasn''t actually important to the overall discussion? What would you do?
While I was wish I could claim the mature, high ground in this situation, I cannot. I kept quiet, and luckily for me (and my ego) the term was not important to the rest of the conversation.
What I went through is what many call imposter syndrome. This is often described as the fear that someone will "find out" about you, that you''re not as good, as smart, or as competent as you somehow managed to convince them you are. If you read the beginning of this newsletter and thought, "wow, I can''t believe Nicholas ever feels like an imposter," then I''ve got news for you: I feel like an imposter frequently. Why?
Quite simply, it''s because there''s a lot that I just don''t know or understand. I''ve been in and around the software industry for over 20 years and there''s never a shortage of things to learn. There''s just no way I can ever know anything, and that necessarily means a gap in my knowledge that can make me feel "less than" in conversations about that gap. I''ve focused primarily on front-end engineering, and to be as good as I am in that, I needed to focus on those technologies and techniques and let everything else fade into the background. That''s a choice I made, and it''s a choice many software engineers make as their careers progress: you can''t know everything, but knowing something deeply often gets you further than knowing a little bit about everything.
I wish I could tell you that there''s some enlightened state that you''ll eventually reach once you''ve had X years in the industry, but in reality, there is no such state. Every competent, reasonably self-aware software engineer will experience imposter syndrome from time to time. You''ll be faced with the same choice I had in that conversation with a former colleague: do I speak up and acknowledge the gap in my understanding, or do I keep quiet and hope it''s not important? Realistically, both options are reasonable and you shouldn''t feel embarrassed about choosing either. The most important thing to understand is that not knowing something isn''t a character flaw to be ashamed of. If you had no reason to learn something in the past, then there''s no reason you should know it now. Not knowing or understanding something is a temporary state that you can address if necessary, and the best software engineer you know doesn''t know about something. Be kind to yourself.
This past month, I read three books:
This month I did a little bit of exploration around Google Cloud Run and TypeScript:
Also, I''m working on finishing up my "Creating JavaScript promises from scratch" blog post series. I reached my goal of 45 sponsors, so all seven parts will be released. Here are the posts so far and what''s coming up next:
This series is brought to you by my sponsors, so if you''ve enjoyed this series so far, please consider sponsoring me on GitHub.
About you: You''re familiar with Webpack, GraphQL, Typescript, and React, and have experience building customer-facing web applications. You''re excited about working on problems that will enable hundreds of full-stack engineers to build beautiful, intuitive, and fast applications. Your impact will be through improving our UI tooling (builds, testing, observability) and building frameworks and reusable components to improve UX consistency and developer experience. Learn more.
Have a full-stack or front-end job you''d like to post on the newsletter? Reply to this email for more information.
You can reply directly to this email to let me know what you thought of this newsletter or if you have ideas for future newsletters.
Unsubscribe | Update your profile
Human Who Codes LLC, 113 Cherry St #92768, Seattle, WA 98104-2205
Hi there,
Welcome to the second edition of the Top of the Month Newsletter, a once-monthly newsletter that will be delivered to your inbox the first Tuesday of each month. My goal with this newsletter is to answer the questions I''m asked frequently and share a little bit about what''s going on with me. So here we go!
One of the most common complaints I hear about JavaScript development today is, "JavaScript fatigue." When people say JavaScript fatigue, they typically mean that they feel like there are always new tools, frameworks, and patterns to learn and keep up with. It seems like you are just starting to get the hang of one way of doing things when something completely new comes along. That leads to frustration and anxiety, and that''s generally what we call JavaScript fatigue.
You might be waiting for me to describe how I combat JavaScript fatigue, but in truth, I''ve never experienced JavaScript fatigue. How is that possible when so much of my career has involved JavaScript? Quite simply, I don''t try to learn about every new thing that comes out. There''s a limited number of hours in the day and a limited amount of energy you can devote to any topic, so I choose not to learn about anything that I don''t think will be immediately useful to me. That doesn''t mean I completely ignore new things as they are released, but rather, I try to fit them into an existing mental model so I can talk about them intelligently. For instance, I haven''t built an application in Deno, but I know that Deno is a JavaScript runtime for building server-side applications, just like Node.js. So I put Deno in the same bucket as Node.js and know that when I need to learn more, there''s a point of comparison.
Would it surprise you to know that I don''t really know how to use Webpack, Babel, or React? I''ve never needed them for any project I''ve worked on, so I haven''t bothered to investigate them. Once again, I understand where they fit in a mental model (Webpack is an asset bundler, Babel is a code transformer, and React is a web UI framework) but I don''t need to know anything more than that right now. Going a little further back, I never built an application using Backbone.js even when it was the most popular web UI framework (pre-React days). As it turned out, that was a good thing for me as Backbone.js was eventually supplanted by React, Vue, and Angular.
The most important skill for a long career in software engineering is the ability to learn new things quickly. If you trust that you can learn new things quickly, then you don''t need to stop and learn every new thing as it is released. You know that when you can learn about something right when you need it. This is true not just with JavaScript, but with any area of interest.
As game developer Kathy Sierra has said, you need to focus on "just in time" information instead of "just in case" information. If something is useful to you right now, keep it close to you; if something might be useful to you in the future, figure out where it fits in your mental model and don''t go any further. Maybe create a browser bookmark or a to-do list item to investigate later. Trying to keep up with every new thing is a great way to end up not just fatigued, but burned-out.
This past month, I read three books:
While it''s true I don''t have a lot of energy right now, I do find time to hack on some projects outside of ESLint.
When you''ve had a blog for over ten years, it''s difficult to remember all of the posts you''ve ever written. A friend just recently reminded me about this post: What kind of a software engineer do you want to be known as? It''s about spending the time to think about how your relationships will ultimately affect your annual review at work. I enjoyed rediscovering this post and I hope you like it, too.
Would you like to see me keep writing books, blog posts, and newsletters? The best way to do that is to support me on GitHub Sponsors. When you sponsor me, you''re not only allowing me to spend time producing content like this newsletter, but you''ll also get some fun perks, like free e-books, early access to books I''m writing, and more perks are coming. Why wait? Donate now
Let me know what you thought about this newsletter by replying to this email. You can also share topics and thoughts you''d like me to write about in the future.
?Unsubscribe | Update your profile?
?Human Who Codes LLC, 113 Cherry St #92768, Seattle, WA 98104-2205
?
Hi there,
I''m not sure about you, but one of the things I''ve really missed recently is going to tech conferences. Yes, we can watch high-quality online videos on various topics, but we are still missing an important part of the conference experiencing: getting to meet and talk to new people. I''ve made some good friends and had the most interesting discussions with people I met at tech conferences. The "hallway track," as many call it, was always my favorite.
Well, I''m getting tired of talking to myself, so I''m starting to set up calls with some of my mailing list subscribers to talk about...well...anything! This is available to you just for being a subscriber, for free.
Some of the details:
What''s the process?
What topics will be considered?
Really, any topic you''d be comfortable discussing at a conference is a good topic for a call. Need advice? I''d love to help. Want to ask how I got started writing? Sure thing. Want to talk about whether the Patriots will be a playoff team without Tom Brady? Happy to dig in.
Ready to get started?
All you have to do is sign up here.
I look forward to hearing from you soon. Take care.
Nicholas
?Unsubscribe | Update your profile?
?Human Who Codes LLC, 113 Cherry St #92768, Seattle, WA 98104-2205
?
Hi there,
Welcome to the third edition of the Top of the Month Newsletter, a once-monthly newsletter that will be delivered to your inbox the first Tuesday of each month. My goal with this newsletter is to answer the questions I''m asked frequently and share a little bit about what''s going on with me. So here we go!
I once had a client who was upset over a mistake at work. They had pushed to use a particular database for a new project, but upon evaluating that database, found that the performance wasn''t good enough for the intended use. When things like this happen, it''s easy to feel embarrassed or down on yourself for making a mistake. However, that point of view isn''t the most helpful because it''s focusing on two things: your identity ("what does this say about me?") and the outcome of the decision (things didn''t work out).
As software engineers, we make a lot of decisions every day. Whether it''s choosing a technology or just how we structure our code, our work is decision-intensive. If you allow those decisions to become part of your identity then every mistake hurts more because it''s a reflection of who are you rather than what you did. If you''ve ever said, or heard someone say something like, "I always use spaces for indentation" or "I''m a JavaScript developer," these are clues that identity is at stake. You can feel it (often physically) when someone challenges these statements by asking you to use tabs for indentation or to switch to Python for a particular project. Those feel like attacks on your identity even though they are just a different way of doing things. So the first step to living with your mistakes is to separate your identity from the actions you take. You aren''t a JavaScript developer, you''re a software developer who at the moment is writing JavaScript.
Next, the tendency to judge all decisions solely based on their outcome is counterproductive. Why? Because there are actually three factors that determine the outcome of any decision: skill, luck, and hidden information. With a few exceptions, you can control the amount of skill you bring into making a decision, and you can work to uncover hidden information (though sometimes it''s not obvious where to look), but luck is completely out of your control. This is the topic of the book Thinking in Bets by professional poker player Annie Duke: most decisions are more like poker (where luck and hidden information play a big role) than chess (where skill is all that matters).She suggests, and I agree, that it''s better to judge your decisions based on the process you use to make them rather than on the outcome alone. This doesn''t mean you disregard the outcome, because it''s possible there was a way for you to act more skillfully, but rather to accept that you can sometimes do everything correctly and still not get the desired outcome. (Of course, it''s also possible to do everything wrong and get a good outcome.)
Duke also makes the point that no decision is 100% guaranteed to work no matter your skill. The best you can do is "place a bet" on how likely it is you''ll get your desired outcome. She gives a helpful exercise: if ever you''re feeling overconfident, imagine your idea is coming from someone else and then ask, "how much money would you bet?" This helps to shift the focus away from yourself (which is helpful because we tend to overvalue our own ideas and undervalue the ideas of others) and also triggers some loss aversion feelings (would you be willing to lose money to see your idea through?).
So when you make a mistake, instead of feeling down, look at it as a learning opportunity. If you can avoid wrapping up the outcome with your identity, then you''re in a great position to determine whether it was skill, luck, or hidden information that affected the outcome. If you determine that skill or hidden information were the culprits, then you can work to become more skillful or to look harder for hidden information next time; if luck was the main culprit, you can just move on knowing that your process was solid and should result in better outcomes in the future.
This past month, I read three books:
This month I mostly worked on the ESLint task to implement new configuration system. After several years, we are completely rewriting the configuration system from the ground up to make it simpler to use and easier to implement. The current configuration system has grown to be so complex that we have a hard time maintaining it and so this new configuration system will relieve some of the maintenance burden.
Would you like to see me keep writing books, blog posts, and newsletters? The best way to do that is to support me on GitHub Sponsors. When you sponsor me, you''re not only allowing me to spend time producing content like this newsletter, but you''ll also get some fun perks, like free e-books, early access to books I''m writing, and more perks are coming. Why wait? Donate now
Let me know what you thought about this newsletter by replying to this email. You can also share topics and thoughts you''d like me to write about in the future.
?Unsubscribe | Update your profile?
?Human Who Codes LLC, 113 Cherry St #92768, Seattle, WA 98104-2205
?
Hi there,
I just wanted to let you know that there''s a new post on my blog titled, Creating a JavaScript promise from scratch, Part 4: Promise.resolve() and Promise.reject(). Here''s a preview:
When you create a promise with the Promise constructor, you're creating an unsettled promise, meaning the promise state is pending until either the resolve or reject function is called inside the constructor. You can also created promises by using the Promise.resolve() and Promise.reject() methods, in which case, the promises might already be fulfilled or rejected...
Sound interesting? Read the full post here:
https://humanwhocodes.com/blog/2020/10/creating-javascript-promise-from-scratch-promise-resolve-reject/
In four posts so far, I've covered the basic ways that promises work, but there's still more to cover. If you are enjoying this series and would like to see it continue, please sponsor me on GitHub. For every five new sponsors I receive, I'll release a new post. Here's what I plan on covering:
Promise.race()
and Promise.any()
(when I have 35 sponsors)Promise.all()
and Promise.allSettled()
(when I have 40 sponsors)It takes a significant amount of time to put together posts like these, and I appreciate your consideration in helping me continue to create quality content like this.
Take care and stay safe.
?Unsubscribe | Update your profile?
?Human Who Codes LLC, 113 Cherry St #92768, Seattle, WA 98104-2205
?
|
Hi there,
My apologies for sending a second email. The email automation that sent out the previous email was misconfigured so the included links didn''t work. Below is the original email with all of the links working. I promise I won''t make it a habit to send two emails back-to-back, but I''ve received enough emails from people about the broken link that I want to make sure everyone gets the correct link to the blog post. I appreciate your understanding and thanks for being a subscriber. - Nicholas
Just a quick note to let you know there''s a new blog post on the Human Who Codes blog! The title is How to safely use GitHub Actions in organizations and here''s a preview:
GitHub Actions are programs designed to run inside of workflows, triggered by specific events inside a GitHub repository. To date, people use GitHub Actions to do things like run continuous integration (CI) tests, publish releases, respond to issues, and more. Because the workflows are executed inside a fresh virtual machine that is deleted after the...
Please click here to continue reading if you''re interested.
Enjoy!
?Unsubscribe | Update your profile?
?Human Who Codes LLC, 113 Cherry St #92768, Seattle, WA 98104-2205
?
Your first-Tuesday-of-the-month guide to being a better, more well-rounded software engineer...plus updates on how I''m spending my time. Hand-crafted for you.
One of my favorite things in the world is painters tape (also called masking tape). It seems like something silly: some tape you put on a wall when you''re painting to avoid getting paint on the wall. The tape doesn''t have a strong adhesive, so it can be pulled back off the wall without damaging it. What I love about painters tape is the philosophy behind it: painting is messy, and rather than trying to avoid making a mess, painters tape allows you to make a mess initially and then clean it up easily. Even the best, most talented painter is going to splatter some paint here and there, get distracted, or otherwise end up with paint going where it shouldn''t. It''s a lot faster, easier, and less frustrating to use painters tape to cover up areas where paint is likely to go and then remove the tape to create a nice, clean, finished area. What does this have to do with software engineering?
Painters tape is all about a concept called fault tolerance. Instead of expecting everything to go well, you instead expect that there will be mistakes. When you expect there to be mistakes, you made decisions not to avoid all mistakes but rather to easily recover when a mistake occurs. Got paint where it shouldn''t be? It doesn''t matter if that spot was covered by painters tape. Forgot to put on the painters tape? Now that mistake is a bigger deal. As software engineers, we can think the same way with the code we write.
Making your code fault tolerant is about asking yourself the question: how will this fail? Not if it will fail, but assuming that it will fail, in which ways will it fail? Can someone accidentally pass null where a number was expected? Is there a calculation made with a lot of variables where any invalid input will result in an indecipherable error message? Is the code depending on an external dependency (such as a web service) that might not be there? How many ways can you imagine a problem occurring that you''ll need to recognize and recover from quickly?
Thinking in about fault tolerance is a different way of thinking about the code you''re working on, and as such, it can be difficult at first to make that switch. A good first step is to look over your unit and integration tests for gaps. You should have tests that cause your code to fail catastrophically and be able to identify which the exact problem by the error that is thrown or logged. In that case, you''re ensuring that you can correctly identify the cause of an error. Sometimes, you''ll be able to recover from the error by silently using some kind of fallback. You should also have tests for that case. Your tests are the first line of defense against unexpected problems, so make sure you include tests that break your code in a variety of ways.
If you''re dealing with a distributed system, it''s even more important for you to think about fault tolerance. The very idea of cloud-based architecture is that your virtual machines and containers may disappear suddenly, and the system should be able to continue working. This is actually one of my favorite things about today''s cloud-based applications: by setting the expectation that your resources may not be available, it''s forcing everyone to think about fault tolerance from the beginning.
As we start 2021, I''d suggest an additional new year''s resolution: start to think more about the ways your code will fail, and how you can be notified of those failures and recover quickly from them. Your manager and your teammates will thank you, and you''ll be well on your way to that next promotion.
This past month, I read three books:
I''ve become a big fan of YouTube videos in 2020, and here are a few that I''ve really enjoyed in the past month:
This month I was excited to launch my new Human Who Codes Money blog! If you''re a longtime reader of my newsletter, you know I''ve been looking more into investing, especially into real estate investing. I''ve spent the past year reading, listening to podcasts, and watching videos about real estate investing and managing my money better. Just as I do with tech-related things, I intend to document everything I''ve learned to share with others. My first blog post is entitled, Why I decided to start investing in real estate in 2020, and here''s a preview:
A lot of people were surprised when I suddenly announced at the end of 2020 that I was under contract to buy my first rental property. To some, this was completely out of character. Why would a software engineer who often spent his free time working on open source projects and writing books suddenly up and decide to buy a rental property in the middle of a pandemic? Well, it wasn''t as sudden as you might expect.
Also, I''m working on finishing up my "Creating JavaScript promises from scratch" blog post series. I reached my goal of 45 sponsors, so all seven parts will be released. Here are the posts so far and what''s coming up next:
This series is brought to you by my sponsors, so if you''ve enjoyed this series so far, please consider sponsoring me on GitHub.
No jobs to share this month. :(
Have a full-stack or front-end job you''d like to post on the newsletter? Reply to this email for more information.
You can reply directly to this email to let me know what you thought of this newsletter or if you have ideas for future newsletters.
Unsubscribe | Update your profile
Human Who Codes LLC, 113 Cherry St #92768, Seattle, WA 98104-2205
Data Name | Data Type | Options |
---|---|---|
Text Box |