开源日报 每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,坚持阅读《开源日报》,保持每日学习的好习惯。
今日推荐开源项目:《妖言惑众 FakeScreenshot》
今日推荐英文原文:《The One Programming Language to Rule Them All》

今日推荐开源项目:《妖言惑众 FakeScreenshot》传送门:GitHub链接
推荐理由:实际上想要做一张假截图是很简单的事情,应该说太容易实现了,不管是模仿还是干脆 PS 合成一个,导致很多时候这些截图会被拿去传播谣言。这个项目能够非常简单,真的很简单的生成一个能够以假乱真的截图——所以以后看到新消息的时候最好自己留个心眼什么的,毕竟那张截图指不定就是从这项目里生成的呢。

今日推荐英文原文:《The One Programming Language to Rule Them All》作者:Eric Girouard Eric Girouard

The One Programming Language to Rule Them All

There’s a language that sits a layer beneath code, and it yearns to be explored

Photo by David Calavera on Unsplash

At the time of writing, “which programming language should I learn” yields 517 million search results. Each page will go on about the advantages one language has over the others, and 90% of them will end up recommending Python or JavaScript.

If I may be so bold, I would like to formally disagree with all 517 million of these results and suggest that the first programming language you should learn is logic.

Knowing how to code just doesn’t cut it anymore. The market is so saturated with bootcamp graduates that the “junior software developer” position has been wiped from existence. To succeed today, you need to know how to code and have a logical mindset to boot.

My First Computer Science Lesson

My first exposure to Computer Science was an elective I took in 10th grade. On day one, I was elated to see a wide spread of ice cream and a variety of sundae toppings before me. After we all took our seats, my teacher proclaimed:

“Today, we’re going to be making sundaes. Under one condition: you have to write a list of specific instructions on how to prepare your sundae — then I’ll follow them.”

No problem, I thought, this will be a breeze. In under a minute, I jotted down the perfect set of sundae-making instructions:
Scoop three scoops of black raspberry ice cream into a bowl

Pour two tablespoons of hot fudge into said bowl

Put whipped cream into the bowl

Place sprinkles and a cherry on top of the sundae
Then my teacher — the computer in this lovely metaphor — put on the most accurately sarcastic display I’ve ever seen. She started viciously stabbing the ice cream carton, lid intact, unable to penetrate its tough exterior.

“OK, remove the lid first,” I said, desperate for a treat.

“You failed to provide me with those instructions, so, unfortunately, I failed to make you a sundae, NEXT!”

Fast-forward to attempt #2

Open the black raspberry ice cream by removing the lid

Scoop three scoops of black raspberry ice cream into a bowl

Open the hot fudge and pour two tablespoons into the bowl

Open the whipped cream and add some to the bowl

Place sprinkles and a cherry on top of the sundae
This time I was sure I had it. I even went ahead and ensured each item was opened before adding it to my masterpiece.

She opened the lid, scooped three scoops, and put them into the bowl. At last, my nascent sundae was finally coming into fruition. Then she opened the hot fudge and placed two tablespoons into my bowl. Not two tablespoons of hot fudge, mind you — two actual spoons, and no hot fudge. I failed to be specific enough — again. When all was said and done, I was handed a bowl of ice cream laden with two metal spoons, a solid canister of whipped cream, and about 300 sprinkles.

I think by this point it finally clicked: the computer is a purely logical entity. It has no context and makes no assumptions. It responds to a very specific set of instructions and follows them to a T.
My final set of sundae-making instructions was a verbose, but necessary, disaster:
If they are not already, open each of the following: Black Raspberry Ice Cream, Hot Fudge, Sprinkles, and Whipped Cream

Aquire a bowl from the stack and place it in front of you

Grab the ice cream scoop and, one at a time, scoop three scoops of black raspberry ice cream into the bowl. Place the scoop down when done

Aquire the hot fudge spoon if not already in your possession, then fetch two tablespoons of hot fudge and place them into the bowl, one at a time, and put down the hot fudge when done

Turn the whipped cream upside down, press your finger against the nozzle over the bowl for 3 seconds, and return the bottle to its resting position

Sprinkle approximately 40 sprinkles over the bowl and return the shaker to its upright position when done

Fetch a single cherry from the cherry jar and place it delicately on top of the sundae
Hand the sundae to the student along with a spoon
That last bullet was extremely important because she started eating my sundae without it.

This is the reality of computer programming. Providing intense sets of detailed instructions to a computer. In essence, this is what all programming languages decompose into — instructions.

The Software Development Career Path

Software development is now at a point where it’s too broad to discuss as a single industry, just as “software developer” is too broad a job title. Two developers can be equally marketable while having disjointed skill sets, implying there is more to a career in development than the mere ability to code. There’s an attribute skilled developers have that is universal and separate from programming — logic.

The best developers are experts in critical thinking. This is essential because the majority of software projects are undocumented, splintered disasters. They require a critical thinker to piece information together and fill in the gaps when needed. The developers who lag behind are those who cannot connect the dots.

All this culminates to another bold statement, this time in bold: The fundamentals of computer science are, and will always be, paramount to coding ability.

Popular languages come and go with the tide. Frameworks become deprecated, and companies react to shifting demands by mixing up their tech stack. The one thing that never changes? Fundamentals — that’s literally their definition!

How to Improve Logical Thinking

Photo by Cristofer Jeschke on Unsplash

For those who can’t quite trek a mountain for deep thought, consider these tools to improve your programmatic critical thinking:

Know your run time complexities

Also referred to as Big-O, the runtime complexity of a program can be expressed as the number of steps taken on any instance in relation to the size of the input (n). Keeping perpetual tabs on the runtime of your programs is step one.

Know your data structures

Data structures are at the heart of every complex program. Knowing which structure to use in what scenario is an art of its own. Data structures tie directly into runtime complexities, as picking the wrong structure can send your programs to a grinding halt. Searching an Array for a value is O(n), which means it gets more expensive to use Arrays as the size of your input increases. Hash lookups are O(1), so the lookup time for a Hash key will be constant, regardless of the number of keys in said Hash.

I’ve had candidates argue that an Array has a faster search time than a Hash. This was an immediate signal not to hire them — know your data structures.


Sites like Udemy, Pluralsight, and Codecademy are incredible resources for learning new programming languages. For fundamentals, turn to books on general engineering concepts, best practices, and coding styles. The most highly recommended books for engineers are Design Patterns, Refactoring, Code Complete, Clean Code, and The Pragmatic Programmer, to name a few. Lastly, every engineer should keep a copy of “Introduction to Algorithms” in their desk for safe keeping.


You cannot become a master violinist without excessively playing the violin. Sites like HackerRank, CodeWars, CoderByte, TopCoder, and LeetCode have thousands of challenge problems designed to test your knowledge of data structures and algorithms. The best approach I’ve found to using these sites is to take your own shot at solving the problem, host your solutions on Github, and then look at the top solutions for that problem to see how others approached it. Which brings me to my last point:

View others’ code

The greatest mistake you can make in your software development journey is to go it alone. Software development is a largely crowdsourced effort. We build standards together, make mistakes together, and learn what works over time (by failing a lot). Taking the time to read skilled developers’ code will always pay off. Just make sure it’s good code.

The best advice I can leave you with is to never feel ashamed of what you don’t (yet) know. As I mentioned, this industry is massive, its number of languages extreme, and the content dense. It takes a great deal of time and effort to build an understanding, even more to gain proficiency, and an immense amount more to gain mastery. I’ll let you know when I get there.