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

推荐订阅源

人人都是产品经理
人人都是产品经理
D
Docker
GbyAI
GbyAI
B
Blog RSS Feed
博客园 - 司徒正美
博客园 - Franky
美团技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
aimingoo的专栏
aimingoo的专栏
C
Check Point Blog
IT之家
IT之家
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com
AI
AI
O
OpenAI News
Attack and Defense Labs
Attack and Defense Labs
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tailwind CSS Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
S
Secure Thoughts
博客园 - 聂微东
L
LINUX DO - 最新话题
U
Unit 42
SecWiki News
SecWiki News
A
Arctic Wolf
Schneier on Security
Schneier on Security
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
Visual Studio Blog
量子位
The Cloudflare Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
大猫的无限游戏
大猫的无限游戏
Google DeepMind News
Google DeepMind News
G
Google Developers Blog
T
Threat Research - Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
B
Blog
博客园 - 【当耐特】
C
CERT Recently Published Vulnerability Notes
Scott Helme
Scott Helme
Last Week in AI
Last Week in AI
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Microsoft Security Blog
Microsoft Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
A
About on SuperTechFans
博客园 - 三生石上(FineUI控件)
Latest news
Latest news

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()
The Path of Software Development Craftsmanship
Dmitri Pavlutin · 2016-09-21 · via Dmitri Pavlutin Blog

The software development complexity is increasing day by day. Almost every year a new framework (like AngularJS, ReactJS) is released, a new build tool (like Webpack, Rollup). Even new JavaScript versions (ECMAScript 2015, 2016 and soon 2017) are released every year!

Generally, the same situation exists in other fields of software development.
For example mobile applications. 2 years ago Apple introduced a new programming language Swift. The iOS operating system releases a new version almost every year with new APIs and features.

This is great for the software industry. But is a big load for us, software developers.

Unfortunately, human intellectual possibilities are impressive... but limited. You cannot (and should not) know all the new frameworks and build tools.

What a software developer can do? The solution is to apply an efficient learning strategy: put accept on programming fundamentals.

The programming fundamentals consist of algorithms, data structures, and programming language knowledge.

If you want to be a great software developer, without doubt, you should constantly master trending technologies (like React, Redux, Angular). And in the meantime put the same amount of effort to learn regularly fundamentals like algorithms, data structures, the principles of writing scaling and clean code.

The article is my own thoughts on how to deal with the development complexity. Also, you'll find an interesting division of developer's mastery progress. I name these phases upside-down triangle, rectangle and triangle.

1. The concept

An important part of the programming fundamentals are the algorithms. An algorithm is a step-by-step description of operations that should be performed to obtain a result.

Algorithms are coded into a computer using a programming language. A web developer usually codes in JavaScript, an iOS developer in Swift (or Objective-C).

The common categories of algorithms that you should know:

The number of existing algorithms is impressive. And many of these algorithms are at the base of software development and networking.

When it comes to learning algorithms, the first reason I hear is that the developer doesn't need to know exactly how specific algorithm works. You may think that all existing algorithms are already implemented, tested and included in standard libraries.
Or that you never had a case to use the Bellman–Ford algorithm in JavaScript.

This excuse is the wrong approach if you are determined to be a successful software developer. To build complex and top quality applications you must have algorithms knowledge.

Indeed algorithms are implemented in standard libraries and developer doesn't need manually to write them. But the lack of expertise doesn't allow the developer to see when a problem is elegantly solved using a specific algorithm.
Libraries with algorithms exist, but the developer simply cannot see the case when they are useful.

Learning algorithms in detail is a valuable experience. Studying and mastering them cultivates an intuition to solve difficult issues.

Powerful intuition is what defines a great software developer. Of course alongside with experience and discipline.

Intuition is a pure gold.

Data structures are an essential aspect too. Learning them teaches how to correctly represent the information in an application.

The correctly chosen data structure has huge benefits. It makes the code that manages data simpler to write and maintain. The operations of data manipulation, storage, query are easier to implement.

The quality code consists of an effective algorithm and a convenient data structure.

2. Beginner: the upside-down triangle

For an easier representation lets divide coding abilities into a simplified scheme:

  • Fundamentals: everything related to algorithms, data structures, computer science questions, application design principles (SOLID, KISS, DRY, SoC), scalability
  • Language: everything related to programming languages (JavaScript, Swift, Java), the syntax, operators, variables, compilers
  • Framework: everything related to frameworks (AngularJS, ReactJS, Cocoa Touch) and platforms (Browser, NodeJS).

The first level of software development mastery is the beginner, which is represented by an upside-down triangle.

Beginner software developer upside-down triangle

Every programmer started at this level, including me.

A beginner developer got really excited by a particular framework, ReactJS for example. He followed some framework tutorials and has a decent level of understanding.

The JavaScript knowledge of such a developer is a minimum necessary to code in ReactJS. He deals fine with defining variables, functions, ES2015 modules, and ReactJS components.

However he has problems with deeper concepts of JavaScript like how this keyword works, prototypal inheritance, hoisting and event loop.

Lack of language experience influences negatively the way components are coded in JavaScript. Usually, hacks and workarounds are used just to make things work.

The knowledge of algorithms and data structures is very limited.
When a part of the application may benefit from a well-known algorithm, the developer doesn't see that and starts inventing the wheel. And the invented wheel is usually low-quality and time waster.

The most used data structures are arrays and plain JavaScript objects. But nothing more.

3. Proficient: the rectangle

The next level is a proficient developer, represented by a rectangle (I hope to attribute myself to this level!).

Proficient software developer rectangle

The proficient developer has mastered well ReactJS framework and JavaScript language. The number of hacks in his code is minimal.

The proficient developer can see the situations when certain data structure or algorithm makes the code more productive. But only until a limited level.

For example, an application has a component that searches often in an array with lots of elements. If the array is altered rarely, the developer concludes that it is reasonable to sort the array. And when a search operation is necessary, use the binary search algorithm, which is very efficient in this situation.

At rectangle case, the developer is able to create quality applications, but not the most efficient.

4. Expert: the triangle

The upper level is an expert developer, which mastered all 3 directions: fundamentals, the language, and framework. He is represented by a triangle with a solid base.

Expert software developer triangle

The expert developer is able to see the efficiency of certain algorithms and apply them when necessary. He benefits from choosing correct data structures, making data manipulations simple.

The challenge is to select from available algorithms the most efficient for a concrete situation. It is a process of balancing to obtain the maximum possible performance.

Since the programming language is an instrument to speak the algorithmic mind, it doesn't matter in what language developer writes. An expert can use several languages: JavaScript & Ruby, or C++ & Java.

5. Recommendations

Trending frameworks or even languages will be gone sooner or later. They will be replaced with better tools: an inevitable result of evolution. What you can do is put an accent on fundamentals.

Certainly, the fundamentals are tough to learn. Many algorithms are hard to understand and remember. My suggestion is just to have fun: you may read a complicated algorithm many times. Think of what benefits may bring a specific data structure. Challenge yourself to become better and better.

Challenge yourself to a master software developer

Despite the fact that fundamentals are difficult, there is a pleasant bonus: it doesn't change often. Starting the 80's or even 70's weren't created any significant new algorithms or data structures. Learn them once and good, then repeat them from time to time, and you're good to go.

The interview process

Big software companies like Google, Apple and Microsoft are serious about algorithms and data structures. An interview at these companies contains many computer science questions, whiteboard coding, balancing trees and so on.

I've read many posts that criticize such an approach that companies query the wrong skills. They say that the developer doesn't deal with sorting algorithms or balancing trees in "real world" programming.
You can beat such arguments easily: I never encountered a programmer that mastered algorithms and data structures, and then claimed it was a waste of time. Moreover mostly claims that these are important.

I personally agree with computer science interview questions. Because the software development industry is moving so fast, the company needs developers that have a solid background.

On one hand, such a developer can efficiently solve complicated problems. On the other hand, he can easily move forward in new languages and frameworks, adapting to a fast-evolving industry.

In the end, it's a real pleasure to be a professional. If you're asked: "Please solve this problem [...] using Dijkstra's algorithm". No problem! Take the chalk, solve easily the problem and impress them how good you are!

Take action

There is no shortcut to becoming a master. What makes you better is learning and practicing.

Constantly learn and practice.

You can move forward in 3 directions simultaneously. Fundamentals, languages, and frameworks are equally important. A JavaScript developer may start with:

After solidifying your ground in those directions, take the next level:

What is your opinion on software development craftsmanship? Speak up your mind in a comment below!