惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Securelist
C
CERT Recently Published Vulnerability Notes
Forbes - Security
Forbes - Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
L
LINUX DO - 最新话题
The Hacker News
The Hacker News
Google Online Security Blog
Google Online Security Blog
SecWiki News
SecWiki News
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
The Last Watchdog
The Last Watchdog
S
Schneier on Security
T
Troy Hunt's Blog
N
News | PayPal Newsroom
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Schneier on Security
Schneier on Security
P
Privacy & Cybersecurity Law Blog
T
Tor Project blog
T
Threatpost
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
A
Arctic Wolf
S
Secure Thoughts
P
Proofpoint News Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Security Latest
Security Latest
Scott Helme
Scott Helme
Security Archives - TechRepublic
Security Archives - TechRepublic
Latest news
Latest news
PCI Perspectives
PCI Perspectives
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
L
LINUX DO - 热门话题
P
Palo Alto Networks Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
V2EX - 技术
V2EX - 技术
Google DeepMind News
Google DeepMind News
Project Zero
Project Zero
V
Vulnerabilities – Threatpost
T
Threat Research - Cisco Blogs
Webroot Blog
Webroot Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
News and Events Feed by Topic
TaoSecurity Blog
TaoSecurity Blog
大猫的无限游戏
大猫的无限游戏
T
Tenable Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
Visual Studio Blog
H
Hacker News: Front Page
Simon Willison's Weblog
Simon Willison's Weblog
AWS News Blog
AWS News Blog

Dmitri Pavlutin Blog

Pure Functions in JavaScript: A Beginner's Guide Record Type in TypeScript: A Quick Intro How to Write Comments in React: The Good, the Bad and the Ugly 4 Ways to Create an Enum in JavaScript React forwardRef(): How to Pass Refs to Child Components TypeScript Function Types: A Beginner's Guide How to Use v-model to Access Input Values in Vue Mastering Vue refs: From Zero to Hero Environment Variables in JavaScript: process.env 5 Must-Know Differences Between ref() and reactive() in Vue How to Destructure Props in Vue (Composition API) Triangulation in Test-Driven Development How to Use nextTick() in Vue Programming to Interface Vs to Implementation A Smarter JavaScript Mapper: array.flatMap() Array Grouping in JavaScript: Object.groupBy() How to Access ES Module Metadata using import.meta JSON Modules in JavaScript How to Trim Strings in JavaScript TypeScript Function Overloading How to Debounce and Throttle Callbacks in Vue How to Show/Hide Elements in Vue Sparse vs Dense Arrays in JavaScript How to Fill an Array with Initial Values in JavaScript Covariance and Contravariance in TypeScript What are Higher-Order Functions in JavaScript? How to Use TypeScript with React Components Index Signatures in TypeScript How to Use React useReducer() Hook unknown vs any in TypeScript A Guide to React Context and useContext() Hook How to Use Promise.any() 2 Ways to Remove a Property from an Object in JavaScript 'return await promise' vs 'return promise' in JavaScript How to Use Promise.allSettled() How to Use fetch() with JSON JavaScript Promises: then(f,f) vs then(f).catch(f) What is a Promise in JavaScript? How to Use Promise.all() A Simple Guide to Component Props in React Don't Stop Me Now: How to Use React useTransition() hook A Simple Explanation of JavaScript Variables: const, let, var ES Modules Dynamic Import How to Memoize with React.useMemo() How to Cleanup Async Effects in React Why Math.max() Without Arguments Returns -Infinity How to Debounce and Throttle Callbacks in React Don't Confuse Function Expressions and Function Declarations in JavaScript How to Use ES Modules in Node.js Solving a Mystery Behavior of parseInt() in JavaScript How to Use Array Reduce Method in JavaScript 3 Ways to Merge Arrays in JavaScript A Guide to Jotai: the Minimalist React State Management Library The Difference Between Values and References in JavaScript How to Implement a Queue in JavaScript A Helpful Algorithm to Determine "this" value in JavaScript React useRef() Hook Explained in 3 Steps 7 Interview Questions on "this" keyword in JavaScript. Can You Answer Them? How to Greatly Enhance fetch() with the Decorator Pattern 7 Interview Questions on JavaScript Closures. Can You Answer Them? What's a Method in JavaScript? array.sort() Does Not Simply Sort Numbers in JavaScript How to Solve the Infinite Loop of React.useEffect() The New Array Method You'll Enjoy: array.at(index) What's the Difference between DOM Node and Element? Why Promises Are Faster Than setTimeout()? Everything About Callback Functions in JavaScript How React Updates State 5 Mistakes to Avoid When Using React Hooks 5 Best Practices to Write Quality JavaScript Variables Type checking in JavaScript: typeof and instanceof operators 3 Ways to Check if a Variable is Defined in JavaScript React Forms Tutorial: Access Input Values, Validate, Submit Forms Prototypal Inheritance in JavaScript How to Timeout a fetch() Request How to Learn JavaScript If You're a Beginner A Simple Explanation of React.useEffect() A Simple Explanation of JavaScript Iterators How to Use React Controlled Inputs Everything about null in JavaScript How to Use Fetch with async/await Getting Started with Arrow Functions in JavaScript An Interesting Explanation of async/await in JavaScript Front-end Architecture: Stable and Volatile Dependencies Is it Safe to Compare JavaScript Strings? How to Access Object's Keys, Values, and Entries in JavaScript What Actually is a String in JavaScript? 3 Ways to Shallow Clone Objects in JavaScript (w/ bonuses) Checking if an Array Contains a Value in JavaScript JavaScript Event Delegation: A Beginner's Guide How to Parse URL in JavaScript: hostname, pathname, query, hash 3 Ways to Detect an Array in JavaScript How to Get the Screen, Window, and Web Page Sizes in JavaScript 3 Ways to Check If an Object Has a Property/Key in JavaScript How to Compare Objects in JavaScript Object.is() vs Strict Equality Operator in JavaScript Own and Inherited Properties in JavaScript 5 Differences Between Arrow and Regular Functions How to Use Object Destructuring in JavaScript Your Guide to React.useCallback()
How to Become a Better Software Developer by Digging & Climbing
Dmitri Pavlutin · 2019-07-23 · via Dmitri Pavlutin Blog

The journey of becoming better in any profession is tough. Mastering requires time, dedication, focus, and choosing the right learning directions.

In this post, I will describe the approach that I use in my journey to become a better software developer.

I want to be honest: this post doesn't contain any shortcuts or tricks. Because generally there are no shortcuts to success.

What's more important, you will understand the importance of choosing the right directions.

1. Shallow knowledge

Probably the most difficult stage of becoming a software developer is the beginning. If you've just graduated, you have about 5-10% of the knowledge required for writing real-world applications.

I was lucky to get a job while studying at the university. Anyways, a few years I struggled because of web development shallow knowledge. It allowed me to keep my job, have income, but nothing more.

Something wasn't right. I felt a lack of deep knowledge. But the idea that things were ok made me agree with the level of knowledge I had.

Somehow, everything went well enough until the team I was working with got a big web-based Java project (for a Romanian government agency). The application used Java on the server side, JavaScript libraries and HTML/CSS on the client side.

As usual, my team was productive at the beginning. But as time passed by, the functionality of the application grew, and the shallow knowledge of the whole team (including myself) started to manifest itself.

Mistakes in software development

After about 1 year in the project, it was increasingly hard to add new features. The bugs were manifesting themselves too often. I remember myself hours and days just fixing bugs. Eventually, the project failed.

Not that I didn't want the project to succeed, it was the opposite. But I concluded that the shallow knowledge, lack of deliberate learning towards the programming language and tech stack are the source of the problems.

I decided to dig into Frontend.

2. I started digging

The first thing is to understand better the programming language you're using every day. In my case, it was JavaScript.

I didn't want to waste my time on superficial learning. I decided to dig as deep as I can.

A good book I found on JavaScript was "JavaScript: The Definitive Guide". It took me more than 6 months to dig into JavaScript specifics, try every code snippet, re-read multiple times the difficult parts.

I solidified more my knowledge using YDKJS series.

Then followed "CSS: The Missing Manual". CSS is known for its property for being hard to master. That's true!

Software development digging

While moving slowly in understanding JavaScript and Frontend stack, often I felt a huge relief. The concepts I've been struggling so much time in the past are now so easy to use.

Overall, did I get the results I wanted? Partially.

I knew how to use efficiently the programming language. I made lots of performance optimizations. I wrote better applications by applying my Frontend knowledge. But still... I was missing something important.

The problem manifests itself by increasing difficulty when adding new components to the application. I felt like I was thrown back to the beginning. It was a bit disappointing.

Turns out, if you dig too much into low level implementation details, you don't develop a vision of the whole picture. You cannot efficiently design functions, classes, and components that are well structured and loosely interact with each other.

Ok, I have to climb through the abstract principles of good system design.

3. I started climbing

Again, I've decided to read a detailed book on how to organize efficiently the system components.

The problem with abstract principles is that they are... too abstract. The brain cannot visualize them, cannot attach them to something material. You might read about a particular principle (e.g. Open/Closed Principle), but when exactly to use it within your application?

I've started my journey of climbing by reading "Clean Code" page by page. It provides a good grasp on how to structure your functions and classes, how to make them focused on a single task.

Then I've continued my journey by understanding coding recipes: the design patterns. I particularly enjoyed Pro JavaScript Design Patterns.

Again, it wasn't enough for me. The next book "Clean Architecture" wasn't easy. I didn't want to miss any detail, so I read the book page by page for about 1 year. At least for me, understanding the principles of clean architecture is hard.

I repeat the principles of good design (SOLID, DRY, SoC, etc) over and over again. Having them always circulating in my head while coding helps to identify the places to use them.

The next altitude I want to conquer is "Software Architecture in Practice" book and understanding Domain-Driven Design.

Software development climbing

Step by step I work out the ability to see and fix structural problems before they get into the code. Or even if they get, refactor until I have better structuring. Slowly I master how to write better applications. I like this feeling.

What defines a good software? The software that is soft, i.e. easy to change, reuse and maintain. That's the main lesson I learned from climbing good design principles.

4. Conclusion

The journey of becoming a better software developer is long and challenging. There are no shortcuts. Who said is going to be easy?

Shallow knowledge lets you stay in your comfort zone. But the disappointment of writing crappy code is worse than the comfort zone pleasure.

To become a better developer, dig into learning the details of your tech stack. It makes you productive at a low level.

At the same time climb the abstract principles of good system design. They're harder to master, but they don't change often. Good design principles make you productive at a high level.

As long as you're striving to become better, digging and climbing never ends.

The books I've chosen for my journey might work for you or not. That's ok. Choose the ones that you like, and go for it. The sooner, the better!

What approach do you use to become a better software developer? Please write a comment below!