• 开源镜像
  • 开源沙龙
  • 媛宝
  • 猿帅
  • 注册
  • 登录
  • 息壤开源生活方式平台
  • 加入我们

开源日报

  • 开源日报第476期:《灵性 awesome-flexbox》

    4 7 月, 2019
    开源日报 每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,坚持阅读《开源日报》,保持每日学习的好习惯。
    今日推荐开源项目:《灵性 awesome-flexbox》
    今日推荐英文原文:《Learning How to Learn: The Most Important Developer Skill》

    今日推荐开源项目:《灵性 awesome-flexbox》传送门:GitHub链接
    推荐理由:介绍 CSS 中关于 Flexbox 布局方式的知识合集。这种布局方式能够更加灵活的布置页面,在页面上组件数量大的时候尤为适用,它可以让你不需要一个个指挥你的组件,而是通过容器一次性控制它们的布局方式。兴许实际操作一下比起说明它们更为容易,了解一下基本概念之后试试实际效果的话理解起来更容易。http://flexbox.buildwithreact.com/
    今日推荐英文原文:《Learning How to Learn: The Most Important Developer Skill》作者:Preethi Kasireddy
    原文链接:https://medium.com/free-code-camp/learning-how-to-learn-the-most-important-developer-skill-7bf62dfaf67d
    推荐理由:学习知识往回踏一步,就是学习如何学习

    Learning How to Learn: The Most Important Developer Skill

    Being an efficient learner is at least as important as being an efficient coder.

    When you’re a developer, your job requires you to learn every single day — in spite of the constant lure of distractions like Hacker News, Twitter, Reddit, and Facebook.

    You constantly encounter new code bases and new technical challenges at work. Home is no better, as you tackle open source repos and personal projects, each with their own processes and challenges to tackle.

    The tech world changes fast, and it can feel like a full-time job just keeping up with the latest tools, languages and frameworks.

    Long story short: learning is hard. Yet, we need to be able to learn quickly and effectively to thrive.

    In the past year, I went from not knowing how to use the Chrome debugger to working as a software engineer for a leading cryptocurrency company. In the process, I rapidly learned a new skill (coding).

    That said, learning didn’t come easy for me.

    Honestly, every new concept was a struggle. There were too many unknowns, and too much uncertainty.

    “How in the world is this sustainable?” I thought to myself.

    “If this is what learning to code is supposed to feel like every day, I’ll be miserable. Is this really my passion?”

    “Wouldn’t this be easy for me if this was my passion? Do artists struggle to produce art? Do writers struggle to write a great book? Do athletes struggle to do well in a race? Are we supposed to struggle when we’re pursuing our passions?”

    “Shouldn’t I be finding pleasure in this?”

    Does it ever get easier?

    Yes, it does. A year later, tackling new programming concepts is still “difficult” in the sense that it requires discipline and hard work.

    But it’s also become an enjoyable process, rather than an overwhelming one.

    What happened in the last year to make that shift possible?

    Simple: I changed my perspective on learning. What once struck me as “difficult” became “engaging.”

    In the rest of the post, I’ll explain how this transformation happened.

    Just getting started

    Learning to code is hardest at the beginning.

    For example, think about the first programming language you have to learn. You want to tackle the small things like syntax and style. But first, you have to comprehend difficult core concepts like values, types, operators, control flow, functions, higher order functions, scopes, closures, recursion, and so much more.

    It feels like learning to juggle — but starting with eighteen pins instead of two.

    When I first learned about closures, it took me many weeks to truly understand the concept. I thought I understood it when I read about it. But when I tried to identify and use closures in practice, I’d find myself stumped.

    That wasn’t unusual. I’ve observed this process as a teacher as well: new concepts don’t usually click the first time around. Or the second. Or even the tenth.

    But for those who stick it out long enough, there will be a “breaking point” where things suddenly begin to make sense. In my example, I read literally every blog post, Stack Overflow post, and spec on the internet about closures.

    Everything I read and experimented with gave me a new perspective, until eventually, I had a 360-degree mental picture of how closures worked. Closures “clicked.”

    Getting to a point where I felt this sense of understanding of closures was super important, because it was rewarding and encouraged me to go for more — including writing my own blog post that explained the concept.

    Learning is a process, not a goal

    If we see learning as something we “have” to do, then we rush to get it done so that we can spend the rest of our time doing something more “fun” — something we “want” to do.

    The problem is that it’s impossible to know everything about anything, so viewing learning as a race leads to burnout and disappointment.

    Instead, if you see learning as a process, you’ll appreciate the small victories and insights along the way. This will drive you to constantly move forward.

    You can compare it to exercise. Workouts hurt, and then the pain ends as soon as your workout ends. But it’s never gone. It’s waiting for you the next time you workout. Except each time, the pain becomes less piercing. You learn to cope with it. You become familiar with the pain, and it just becomes part of the routine. You are rewarded by better health and a better physique and are incentivized to keep going.

    Exercise creates a positive feedback loop:

    The same is true for learning.

    Turning learning into an engaging process

    Imagine building your very first web application.

    At first, all you’ve got is a daunting, blank text editor. The task of building the app seems almost insurmountable. You know nothing, and have so much to learn before you can make this happen.

    Thankfully, you decide to go for it anyway.

    From then on, your main focus becomes to do one small step at a time.

    First, you create an idea. What will you build? Who’s the end user? What are the constraints?

    Second, you prototype or sketch out some rough designs for what you think it might look like. You ask your friends or the internet for feedback, and iterate to make it better.

    Third, you research languages, tools, and frameworks that will work best with your requirements.

    Step by step you discipline your mind to channel all its energy towards this one goal.

    Sometimes you’re writing code.

    More often than not you’re stalled at some bug or error.

    Sometimes you’re too tired to do any work, so you take a break.

    Other times, you don’t feel like writing code. That’s okay. You spend your time researching or reading up on topics related to your project.

    Eventually, after a few weeks of hard work, you’ve built a foundation that can handle your big ideas. Suddenly, working on your app doesn’t feel as painful. You see the reward of the initial set of hard work, and now it’s just another piece of code you need to write or another bit of refactoring you need to do — which you’ve done 100s of times already, no problem.

    You turned what was once a daunting or dreadful activity into one that is complex and engaging.

    This is how we grow. This is how we get better. Whether it’s programming, dancing, running, or reading: it’s not easy, and there won’t ever be a time or place when you’re “done” learning.

    Instead, enjoy the process of investing your energy into something, and enjoy the pain that comes along with it. You’ll start to notice that you no longer describe it as “pain” — because what was once painful becomes a symbol for what’s next: a sense of personal accomplishment and self-satisfaction.

    In other words, struggle and enjoyment will start to mean one and the same thing. Remember the cycle:

    One approach to learning technical topics

    Let me tell you a little about the learning process I follow. This isn’t the be-all-end-all of learning styles, so if something different works for you, please share it in the comments! In case you can’t tell, I’m a nerd about this stuff 🙂 Let’s use the process of learning the React.js library as an example.

    What is the motivation for learning this?

    First step: I’d start with a Google search for the React.js documentation and read a bit about the background and motivation for the library.

    Knowing the “why” behind any topic is incredibly helpful for framing the learning process. It answers questions like:
    • How is this different from other solutions?
    • How useful is this to me?
    • What problems does this solution aim to solve?
    • Is this just a new shiny tool that’ll only be useful for a few months or will it fundamentally change the way I think and code?

    Reading and understanding core concepts

    Second, I’d read through any intro articles or examples provided in the docs.

    Notice I’m not touching any code yet. Reading and sinking in the core concepts comes before hands-on experimentation. It’s incredibly important to do this because it lays the foundation for the rest of my learning.

    Even though I might be able to get away with blindly using React.js without learning the core concepts, eventually it’ll catch up to me when I run into a bug.

    First time coding

    After spending some time on the above steps, I start to get the gist of what’s going on, or maybe even feel like I totally get it. Then it’s time to jump into some code.

    I typically try to build something really small with any new tool by following a video tutorial (e.g. on egghead.io) or a written tutorial before jumping into custom projects.

    When you get stuck

    …And then, inevitably, I get stuck.

    Reading the docs seemed like a piece of cake, but actually using it in practice makes me realize I have no idea what’s going on.

    This is when I start to feel that dreaded “just give up” feeling. But instead of giving in when the going gets tough, I remind myself that pain == gain. Turning back would be cowardly.

    Here’s what I do instead:
    1. I first narrow down and figure out what I’m actually stuck on — i.e. define the problem. Then I come up with a hypothesis for what I think could be the root cause or causes of the problem. Even if I have no idea, I just make a guess.
    2. Then I step away from the problem and my computer and do something that relaxes me. This is incredibly hard to do when I’m so upset about the problem I’m stuck on, but letting go of the problem works wonders. (Ever notice how great ideas always strike in the shower?)
    3. Now I try to debug with my hypothesis in mind. I get as far as I can on my hypothesis without looking for answers online — there’s something beautiful that happens when you try to solve problems by truly thinking deeply about them on your own first. Even if you’re going down the wrong path, the fact that you made the effort teaches you a lot and you remember the problem space much better next time you run into it.
    4. If my hypothesis leads to an answer, hooray! I’m done. If not, I Google search for documentation, blog posts, or Stack Overflow posts that could help me get closer to the answer.
    5. While reading, I take notes on any and all pieces of information that could potentially be helpful.
    6. Still no solution? That’s fine. I’m sure I learned something valuable by reading through all that, even if it didn’t directly help me solve the problem at hand. Who knows when this knowledge might come in handy next time?
    7. At this point, if I’m truly stuck, I will either post a question on Stack Overflow or ask a co-worker or developer I know.
    8. Otherwise, I rinse and repeat until I get closer to the final solution. At some point, the answer always comes.
    At times this process takes a few seconds, and other times it takes hours (or days). Either way, the process itself is incredibly beneficial to your skill set as a developer.

    Getting stuck on a bug feels like stumbling in a dark tunnel looking for a ray of light. You eventually find it, but along the way you discover so much about the tunnel — and it’s knowledge about the “tunnel” that makes you strong as a coder.

    Think of debugging as a chance to explore rather than a detour from your goal, and it becomes much more fun.

    Rinse and repeat

    By this point in the learning process, I’ve built something small and tackled some small hurdles along the way. As you can see, it was a struggle — clearly, I need some more practice with the new tool.

    So, once again I try to build something on my own. Rather than jumping straight to a big custom project, I’ll look for a repo to base my application on.

    For example, if there’s an online CRUD todos example (of course) using React.js, maybe I’ll build a different type of CRUD application. Just different enough to keep me engaged, but not so different as to make me discouraged if something goes wrong.

    Mastery

    Mastery requires repetition, so I keep building more small projects until I feel like I’ve got the core concepts down.

    Eventually, I begin to be able to piece things together on my own without constantly referencing documentation or examples. Only then do I finally adventure out and build something from scratch on my own.

    Throughout this process, I aim to make the process fun and engaging. I’m constantly pushing myself to work on things that are harder than what I am capable of in the moment, but not throwing myself into the deep end so that I get discouraged and never finish.

    Finally, I make sure to step away as soon as I find myself getting too frustrated to enjoy the project.

    Learning is fun

    With some effort and structure, learning programming turns out to be incredibly fun. At first it’s incredibly complicated, and in my opinion that’s why so many people get scared away — not because it’s “boring,” but because it’s “hard.”

    After you go through this learning process a few times, processing new information becomes a muscle memory. You don’t really think about it. You just learn to ride the pain wave and find joy in the reward.

    Like magic, it becomes “easier” to learn.
    下载开源日报APP:https://opensourcedaily.org/2579/
    加入我们:https://opensourcedaily.org/about/join/
    关注我们:https://opensourcedaily.org/about/love/
  • 开源日报第475期:《特别鸣谢 all-contributors-bot》

    3 7 月, 2019
    开源日报 每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,坚持阅读《开源日报》,保持每日学习的好习惯。
    今日推荐开源项目:《特别鸣谢 all-contributors-bot》
    今日推荐英文原文:《A Comprehensive Guide to Becoming a Self-Taught Programmer》

    今日推荐开源项目:《特别鸣谢 all-contributors-bot》传送门:GitHub链接
    推荐理由:不管是修正代码还是完善文档,人们通过各种各样的方式对一个开源项目做出贡献。而有的时候要想收集所有贡献者名单并感谢他们是一件比较困难的事情,特别是在大规模的项目中。这个机器人会自动的收集那些贡献者的信息——只要他们记得在 issue 中提到这一点,这样你就不需要亲自一个个的寻找这些信息。不管贡献大小和重要程度,人们花费自己的时间来帮助建设一个开源项目,这自然是值得感谢的。
    今日推荐英文原文:《A Comprehensive Guide to Becoming a Self-Taught Programmer》作者:Aditya Patange
    原文链接:https://medium.com/better-programming/a-comprehensive-walkthrough-to-becoming-a-self-taught-programmer-and-computer-scientist-part-i-288541b19940
    推荐理由:通过自学在编程的道路上走得更远——不得不承认,大部分时候学习编程都是在自学

    A Comprehensive Guide to Becoming a Self-Taught Programmer

    As promised in my previous post(https://medium.com/@AdityaPatange/learning-to-program-is-a-great-way-to-improve-yourself-and-grow-your-career-heres-why-5cc8276453fa), I’m here to kick-start your journey towards becoming a highly-skilled, sought-after programmer. I’ll also help you achieve career success, augment your existing skillset, and make money — irrespective of which discipline you’re from.

    I’m the guy with a plan.

    This guide is for everyone and as long as you can read English and know basic middle-school mathematics, you’re good to go. So sit back, grab a cup of coffee, and pay attention!

    Every part of this guide has been meticulously curated for you — I have personally gone through every resource I recommend here. The logical order of the contents, resources, and suggestions have been put together with the sole motive of making you a skilled programmer in the shortest time possible without compromising on quality.

    How to Use This Guide

    You are most likely to fall into one of the five categories below:

    1. You already know to code and want to become a better software developer.

    Great, in that case, you already have your basics covered and must work on developing a holistic way of thinking about building Software. Pay special attention to Part I and Part II, as they will fill gaps in your existing knowledge.

    2. You’re in a STEM field, but don’t know much about programming.

    Your analytical skills are already above par, so don’t spend a lot of time on Part I apart from the readings. Pay special attention to Part II and Part III because you need to focus on writing code.

    Don’t join the bandwagon of people who see buzzwords like AI, Machine Learning, Blockchain and jump straight to these technologies without understanding fundamentals. That’s stupid, because, after a point, you will get overwhelmed and give up or learn it all wrong.

    3. You’re from a non-STEM field and want to learn to code.

    In your case, the initial hurdle would be to train your mind to think more logically and analytically. Devote the bulk of your time to Part I. The challenge is being able to transfer your existing mental framework(s) to a completely new domain. The shift takes time and cannot be rushed, so be patient and stick through. Once this happens, you will be in a conducive mental state to devote more time and effort to speed up your progress in later stages. You might progress faster than your STEM counterparts, as your divergent thinking skills are more advanced, making you inherently more creative and intuitive when coming up with solutions.

    4. You’re going for further studies abroad.

    Clearly, this is the segment that will benefit the most from this guide. Within this post, I will teach you how to incorporate method in your ways of working, so that you can get things done efficiently. Subsequently, your goal will be to rewire your approach towards learning by unlearning the practises you followed to succeed in the Indian Education System.

    The competition you will face abroad, especially in the U.S, is cutthroat, and your peers will already have a head start as compared to you. Work on leveling the playing field before you go there. Use the knowledge in this guide to build some interesting projects, write research article(s) and become a well-rounded professional.

    If you want to get into academia, read the books I recommend in Part I and take some courses I recommend in Part III. To create new knowledge, you need to understand existing knowledge as intuitively possible. If you’re seeking job opportunities abroad, this guide will still help you develop industry skills to bag the best opportunities that present themselves to you. Remember, there are people who complete their Master’s Degree in good universities abroad and still don’t get placed, because they were still plugged into the traditional ways of thinking or lacked relevant skills to adapt to the fast-paced environment there.

    5. You’re an engineering student relying on the Indian Education System to prepare you for the real world.

    Honestly, I hate to do this, but it’s necessary for me to pop your bubble right here. The Indian Education System is not designed to prepare you for the industry. Getting your B.E/B.Tech degree means nothing to employers if you cannot bring value to the table.

    There are tons of engineers out there, who spend their entire 4 years doing nothing but “improving their pointer (C.G.P.A)” and still don’t get the job of their choice, or worse, remain unemployed because they never considered it important enough to build industry relevant skills.

    All of a sudden, when the placement season in their college starts, the realisation that they need to change their flawed assumptions hits them like a truck. At that point, it’s almost too late to adapt. The tension around getting placed becomes a nightmare. If you’re one of those people, wake up because you still have a lot of time. You’re smart enough to score great grades, so you are definitely smart enough to pick up relevant skills in order to make yourself valuable.

    Either way, you have nothing to worry about because you’re at the right place. I have hacked up this curriculum so that you can bring yourself right back on track and acquire the necessary skills.

    How Is This Guide Different From the Tons of Articles on the Web?

    The information here is an amalgamation of nearly eight years of programming experience, nuggets of wisdom from some of the finest books, online courses from world-class universities, and the awesome programming community out there. I have trodden the path myself, sifted through all the conflicting information on the Internet, hit dead-ends, and backtracked repeatedly. By following this guide to the T, you will not only save valuable time but enjoy the entire process much more. This curriculum is designed to ease the entire process for you.

    A lot of you would question why I have included computer science (CS) in the title. What has programming got to do with computer science anyway? Let me put an end to this discussion once and for all. Knowing computer science makes you a better programmer — plain and simple. Even without CS, you might be a good programmer, but what you can do is severely limited because CS wields you with a powerful toolbox to tackle problems. If you think otherwise, chances are that you will keep hitting brick walls and waste time — like I did when I first started off.

    To become a skilled programmer, work with this guide and the resources provided diligently for a solid six months to one year, and your efforts will be rewarded.

    Enough said, let’s dive right in!

    The Real Deal: A Step-Wise Roadmap to Becoming a Competent Programmer

    I have divided the entire guide into four parts to delineate the entire path. It’s important to spend some time on each part before moving on to the next because your skills build on one another. This is no “Learn Programming in 21 days” kind of guide. You have to put in the effort and the hours. I am just here to guide you. Revisit this post periodically to refresh your knowledge and not lose track of the big picture, so bookmark it. There is no fixed amount of time you can dedicate to a particular part, so feel free to move back and forth as you progress. As I have said before, every skill you learn builds up on each other.

    What exactly is Computer Programming?

    (You can skip this if you’re already a coder)

    To put it in a single sentence, programming is the science of making a computer do a task by giving it precise instructions to carry it out.

    This is how Python code looks like. You will learn Python in Part I.

    Computers are far more powerful than humans because they can process billions of instructions in a few milliseconds and, at the same time, store large amounts of data to process. Humans cannot do this. In the time you’d require to multiply two 5 digit numbers, a computer will multiply billions of much larger numbers and do it with 100% accuracy.

    So now, the key question is: how can you leverage this power of computation? Simple, you feed the computer with instructions on how to multiply two numbers and it will do it for you. Say you want to multiply two numbers, this is how you’d instruct the computer to do it.

    To multiply 2 numbers, you explicitly tell the Computer: Step 1: Take a number A. Step 2: Take a number B. Step 3: Let C be the product of A and B. Step 4: Display the value of C to the user.

    We computer scientists call this an algorithm. It’s just a sequence of steps for solving the problem. Don’t stress on the jargon for now.

    Programming Languages

    As humans, we cannot state this entire sequence of steps in 0s and 1s, which is why we use programming languages.

    It is the bridge between machine level descriptions and plain English. As shown in the diagram, the high-level languages are easier to understand, whereas low-level languages, like Assembly, can get cryptic at times. You write code in the programming language of your choice. Behind the scenes, this code is converted (in simple terms) into lower level descriptions so that the computer can run the instructions on the underlying hardware.

    That said, let’s begin with Part I.

    For every part, I have provided a link to the resource document, so don’t forget to check that out!

    Part I: Develop a Programmer’s Mindset


    The right mindset is about creating positive feedback loops. Jordan Peterson talks about this in detail in his book “12 Rules for Life”.

    The first and most important step is to start thinking like a programmer. If you’re coming from my previous post, this is the part where you learn to think algorithmically. The motive behind this section is to train parts of your brain to think logically. If you come from other disciplines or your analytical skills are weak, spending time on the material in this section will help you see problems in a new light and make you better at breaking them down into smaller problems.

    Most beginner programmers are not aware of the subtle shifts in their cognitive abilities as they begin coding. Explicitly working on this and being aware of it is advantageous, because you learn the art of deconstructing problems without thinking of technical details. Explicitly state your reasoning in English, generalise the steps, and form patterns to tackle further problems.

    If you have some experience with coding, you’ll be familiar with this situation. Think of all the times you’ve seen a problem and thought — “Oh, this is easy, I can use nested loops” or “I can use an array to solve this problem”, only to discover later that you were headed in the wrong direction. This happened because you jumped into the technical details too early without representing your problem correctly.

    Keeping that in mind, the first step would be to approach mathematics a bit differently.

    1. Relearn/Revisit Basic Mathematics

    To excel in mathematics in school and college, we’re taught to plug in numbers and memorise equations without any deeper intuition behind the formulas. This isn’t very helpful when you want to write programs. Learn why you’re applying a certain step when solving math problems. Understand what the step does and how it transforms the problem into a simpler one. For every problem you come across, deliberately think of ways in which you can solve the problem using a basic set of “tools” you already know. Knowing which tools to use and how to use them comes with practise and by identifying repetitive patterns.

    Here is a very simple example to demonstrate this: Say the problem is to multiply two with itself 10 times. We know that this is represented as 2¹⁰. A new tool or operator called exponentiation was used to make the problem simpler. Now, you can apply all the properties that apply to exponents. By changing the representation of the problem and by using the right tool, you gave yourself more power, pun intended.

    If you are already good at mathematics, you can avoid wasting time here and jump straight to learning the basics of discrete mathematics. The approach stays the same. If not, do the heavy lifting here and practise discrete mathematics in Part III.

    Check the resources section for a detailed description of the resources you can refer to.

    2. Learn Python

    I recommend learning Python because it’s simple and akin to writing pseudocode or statements in English. The language does require you to specify many technical details when expressing solutions. Get yourself familiar with just enough programming concepts to transfer the mathematical definition of a problem into its programming equivalent.

    Focus very specifically on learning to implement variables, integers, and floating point arithmetic, loops, conditionals, strings, lists, dictionaries, and functions. The courses I recommend will teach you these concepts perfectly. All you need to do is practise.

    Note: The reason why I didn’t recommend C or C++ at this stage is because the language will punish you for not knowing technical specifications well enough. Sometimes, simple C++ errors can be huge and overwhelming — which is really scary for a beginner.

    3. The art of using Google search

    This may seem hilarious, but part of being a good software developer is knowing how to compose an effective search query. The problem you’re facing has already been solved by someone else. Most of the times, you don’t need to reinvent the wheel. All you need to learn to do is look up similar problems that have been solved, examine their solutions, and use them to solve your own problem.

    4. Read heavily.

    Devote 30 mins of your day to reading the content I have prescribed in the resources document at the end of this section. Read each part carefully, write notes, discuss the ideas you learnt with your friends, and think deeply. As you read, filter what matters and discard what doesn’t. If there is something you don’t understand, watch a YouTube video or read up on the Internet. I have tried to organise the content in a way that you won’t come across too much irrelevant information, but that is going to happen anyway.

    5. Shift to a UNIX system (optional)

    Now, this might not be favourable to a lot of people who use Windows for work purposes, because Windows is easy to use. If you want to become a software developer, I’d highly recommend shifting to Linux or Mac. Personally, shifting to Linux pushed me into an uncomfortable zone and I was no longer afraid of breaking things. If you need Windows for work, set up a virtual machine or dual-boot and develop on that. I leave this to you as it’s purely a personal choice.

    Summary

    Throughout this stage, I want you to do quality work by thinking really deeply about your problems. You must be able to express and brainstorm the thought process behind coming up with a solution. This not only improves your analytical skills but also makes you a better communicator. At this stage, it’s fine if you’re slow at writing code or struggle to express the programming equivalent of the solution. What matters is your ability to break a problem down, use a set of tools to solve it, come up with a solution, and communicate it.
    Part I Resources(https://www.evernote.com/l/AiyEMUeeBdhP6p6Dxw7rIWPPNbra-h2xy7Q)

    Part II: Think, Plan and Execute Like a Programmer

    Now that you know how to solve problems, reason about the solution, and communicate your ideas fluently, it’s time for you to put these skills into to practise, like a programmer does.

    Donald Knuth: Hands down, one of the greatest Computer Scientists the field has ever seen.

    In this part, there are three things you need to learn. Firstly, you will learn C++ as a second language, which is closer to machine-level descriptions as compared to Python. Python is closer to the spectrum of plain English, whereas C++ is closer to the end of the spectrum of 0s and 1s. Learning C++ will make you familiar with more programming constructs like pointers. Secondly, you will improve your coding speed by practising intensively, reading documentation, and further fine-tuning your debugging skills. Finally, you will learn recursion, which is the magic programmers and computer scientists use to harness the power of computation.

    1. Learn C++ and start writing simple programs

    You’ve already learnt Python in the previous part. Python is a programmer-friendly language, as it hides a lot of low-level details from the programmer for ease-of-use. However, if you want to progress, it’s absolutely necessary to learn the fundamentals of programming in C++.

    What to focus on: Writing code in C++ will make you feel more programmer-like, because you’re going more towards machine-level descriptions. Learn the difference between syntax and semantics. Spend time learning static and dynamic typing, memory management, and pointers. Learn to implement conditionals, loops, functions, data-types, and stuff you learnt in Python all over again in C++. If all this seems like Greek and Latin, don’t worry. The resources section will make everything clear to you.

    Handling errors: Whenever you get an error, don’t get discouraged. Even the most experienced programmers have errors and bugs in their programs. All you have to do is read the error, do a quick Google search, and fix the issue in your code. While you do this, understand where you made a mistake, correct your understanding and proceed. Sometimes you may have to read a bit of documentation. Check the next section.

    2. Reading documentation should be second nature for you

    Just like doing a Google search, a programmer’s skill is decided by how well he can understand documentation and write useful programs. As you learn to read documentation, you will also learn to comment your code, write readable code, and write documentation for the code you write.

    Why should you learn this? A lot of people struggle with learning new technologies and look for ready-made courses to learn from. While this is fine in the initial stages, as your knowledge deepens, you won’t find ready-made tutorials to spoon feed yourself with. You will have to read through documentation and pick up what you need. Again, learn to filter out information and take exactly what you need to get the job done.

    3. Practise. Repeat. Practise.

    Now you just have to keep practising. Head over to Hackerrank and solve all the easy problems in the warmup and implementation section there. If there is a problem you cannot solve, read the discussions, read the editorial, and see how you can solve it yourself. If there is something you don’t understand, use Google.

    If you have done the readings in the previous part, you shouldn’t have a problem here. If you’re struggling, I’d suggest you go back and revisit those sections. You must become good at writing code, so don’t skip this part. The idea is to be fluent in expressing your plain-English solutions into their programming equivalents. Once you’re not bogged down by language specifics, you can proceed. Take all the programs you wrote in Python and code them up in C++.

    You may come across the hype around competitive programming, I’d recommend you to stay away from it at this stage because it will do more harm than good. Once you finish Part III, you can experiment with it and, if done right, it can enhance your problem-solving skills tremendously.

    4. Understand recursion well


    This will help you understand recursion better. Haha.

    The heart of a computer scientist lies in the ability to understand recursion. To recurse means to express something in terms of itself. Everything you can do using loops can be done recursively and in very elegant ways. Try to understand this intuitively and watch the videos I have provided in the resources. If you’re a software developer who doesn’t understand recursion well enough, I’d recommend doing it right away.

    Summary

    So far, you know a low-level and high-level language and can sufficiently appreciate the differences in the “control” that you have over your programs. By now, you should be able to write simple programs using Python and C++ and appreciate the difference between both languages.

    From here, many people go into the rut of learning more languages which is nothing but a useless exercise by itself. One of the most common questions I get asked by beginners is “How many languages do you know?”, which brings me to realise how misguided beginners generally are as they relate programming prowess to knowing more languages. Programming is not about knowing a lot of languages. The language you use is just a way for you to express and solve your problem effectively. At this stage, you are a “programmer”, but that’s not enough. You now need to learn Computer Science to take your skillset to the next level.
    Part II Resources(https://www.evernote.com/l/AizOpIHf1kJPmIPy1VOM33YInoimkpDNk1s)

    Part III: Your Tryst With Computer Science

    A solid understanding of the resources in this stage will make you better than most programmers in your peer group. You may even become better than most 2nd/3rd year engineering students in India. Your progress from here depends on your thirst for the material in this section. So focus.

    To add some of my philosophical touch, delving into Computer Science is like opening Pandora’s box.

    Most of the topics in this section are covered in the 2nd year of an undergrad Computer Engineering course. I have approached them a bit differently to best suit the objectives of this guide.

    How does this differ from a regular undergraduate curriculum? Regular undergraduate curriculums are heavily loaded with theory. The courses I have suggested in the resources section have a good mix of theory and practise. While this may be a good thing for aspiring engineers, for the layperson out there, it’s not very useful. You lose track of where theory ends and practise starts. I’ll point out exactly what you need to learn theory-wise so that you can go straight ahead and practise. Theory is just a tool to help you write better code at this stage, so don’t get bogged down by it too heavily.

    Fun Fact: In my 2nd semester of engineering, we had a subject called DBMS (Database Management Systems). I was surprised to find people who’d draw the best ER diagrams for their database designs, but when it came to actually designing a database for practical applications, they’d fail miserably. They were so focused on getting the details of the diagram right, they’d forget the very reason why they were doing it in the first place. I don’t blame them, because they were never taught that the diagram is there for them to build better databases, not improve their sketching skills.

    1. Discrete Mathematics

    You’ve already been using discrete mathematics unknowingly. Discrete mathematics is a combination of areas in applied mathematics that were repeatedly used in computer science. The experts in the field decided to club it all together and put a name to it — which we now call discrete mathematics.

    Don’t worry girls, she wrote the first program

    When learning discrete mathematics, follow the same principle I outlined in Part I. Think in terms of mathematical structures and the procedures used to manipulate them. Discrete mathematics simply increases the number of tools at your disposal for tackling problems. If you have overcome your fear of mathematics, you will thoroughly enjoy the course I have linked in the resources section.

    2. Data Structures and Algorithms

    This is the backbone of your entire journey. In fact, you’ve already been using data structures and algorithms all this time — again unknowingly. Now we’ll formalise it and study this more in detail.

    Linus Torvalds built the Linux Kernel — something without which Android wouldn’t have been what it is today

    As an experienced programmer, you will be using data structures and algorithms everywhere. Understanding it well enough will extend your mathematical skills and tools to build effective computational structures for tackling common problems. You will also learn different algorithm design techniques, which are like blueprints for solving some themes in computer science.

    Many tutorials will tell you to start learning algorithms and data structures straight up. The reason why I didn’t do this is because you’d get into Einstellung, which is having a fixed-mentality and approach to problems. Trust me, that cripples your thinking because you don’t think outside the box. By the end of this, you will be a great problem solver and coder.

    3. Best Practises

    Writing software is not just about haphazardly putting together code to get things done. In most professional environments, you won’t be the only programmer working on a code base. It is important for you to follow certain guidelines and conventions to make programming the code base easier for everyone on the team. This makes it easier to understand code written by someone else and subsequently makes it easier for others to understand your code. If you are a junior software developer, focus on this section.

    What can you do? Spend time understanding and putting the DRY (Don’t Repeat Yourself) Principle in practise. Don’t write repetitive code, as this slows you down and makes you more prone to mistakes. Write useful comments and documentation wherever you can. When I started off, I thought this was a stupid thing to do till, one day, I opened an old project and realised that all of my code was unintelligible. As a programmer, you don’t need to memorise much. You memorise what is important and look up what’s needed.

    4. Version Control (Git)

    This is something I started doing early and it helps tremendously in keeping code organised. You track your changes and know exactly what changes you need to implement certain features. You also learn how to prevent and fix bugs quickly. I see a lot of young engineers who don’t even know what Git is, and that’s extremely sad. They’ll spend their entire career using version control — if you’re one of them, head straight to the resources below.

    5. Object-Oriented Programming

    An introduction to a completely new way of programming. So far, we’ve been doing procedural programming. Now we shift to object-oriented programming, which is a new paradigm altogether. An introduction to data encapsulation and abstraction will further help you appreciate the way this guide has been designed. In OOP, everything is an Object and the idea is to clearly separate your interface and implementation. You will learn Classes and Inheritance too. In the end, you’ll start designing Object-Oriented solutions and learn how to build clever black-boxes to solve problems. Learning Java is a good way to get started with this new programming paradigm. Python supports OOP too, so try exploring that!

    6. Practise Hard

    Practise every skill/concept/algorithm in this section by writing code snippets. Rewrite old code with the new knowledge you have acquired. Keep writing small programs and learn something new from it at every stage.

    Bruce Lee: The super-human human. R.I.P legend

    Keep learning as you progress. I have built calculators, library management systems, numerical computation scripts in so many different ways, and every single time, I learnt something different. You will eventually come to realise that there is no golden bullet to fix everything. Life is full of trade-offs. That is the beauty of imperfection.

    Summary

    You know more than enough to build game-changing software. You must internalise everything up till here to go to the next step. From here, more theory won’t do you any good. You should solely invest time in practising and building useful projects. Programming is an applied science — follow the 80/20 rule, which means spending 80% of time practising and 20% of time reading theory.
    Part III Resources(https://www.evernote.com/l/AiwMbWape4BMF6lnhDumgLslMgtDvffqzBo)

    Part IV: It’s Time for You to Build Some Cool Stuff

    If you’ve followed the guide till here to the T, you’re well equipped to go ahead and build some great projects that you can put on your CV, show-off to your friends, or even generate revenue from your work. In this stage, I want to teach you how to learn things along the way. Every new project you take up or are assigned to will demand learning something new. It’s important that you approach this with the right attitude.

    I have always been inspired by Mark Zuckerberg for his undying attitude towards nullifying failure

    There are some guidelines you can follow whenever you take up any project. I developed this rubric for myself and realised it would be handy for you folks taking up new projects.
    1. Identify the problem you’re working on and be very specific about the details. Be clear about your goals and objectives.
    2. Look up existing or similar projects and identify where they excel and where they lack. See where your idea fits in, how the project aligns with the goals and objectives you have in mind and make a note of everything.
    3. Make a list of all the skills you need to learn to do the project and the extent to which you need to develop the skill to get the project done. Know your strengths and weaknesses.
    4. Create a plan to learn the necessary skills. Identify the right people to help you and necessary tutorials to get started. Focus exclusively on developing the skill to get your project done. It’s easy to get carried away into going in-depth. Remember, you’re learning the skill to complete the project and not write a Ph.D. thesis on it. Unless that’s your goal.
    5. Get started with the project, update your goals and objectives, and be very clear about your strengths and weaknesses. Break the project down into doable sub-tasks and assign an objectivity metric for each. This means you need to know when to stop chasing perfection and focus on the big picture.
    6. Execute impatiently. Repeat till all your objectives are fulfilled.
    Read this for tips and tricks on how to become a better learner.(https://qr.ae/TWtGTY)

    Given your existing knowledge, you can learn to build websites, mobile applications, games, small scripts, Chrome plugins, desktop apps, and data analysis software. I’ll provide more information on this in the next post. Once you have some completed projects under your belt, you will be a good enough developer to freelance and make money on the side, which is a great source of income if you’re a student. If you’re from another field, this gives you a solid enough base to be able to augment your current work with technology. What you can with your current set of skills is endless, even an entire blog-post cannot do justice to that.

    Ideally, I’d love to OpenSource my projects for you to learn from. However, at this moment, I am at a crossroads in terms of deciding what projects I want to transform into full-fledged products/ventures. The thing is, as you keep learning more, the possibilities with what you can do with your past projects is also endless.
    Part IV Resources(https://www.evernote.com/l/AiyFNI9SqyFPZYxAeHTRlDcmuqsxS6vx4h8)

    Conclusion

    After spending considerable time on the material in this guide, you will have learnt enough to know how to proceed further. With the knowledge you’ve picked up from here, your foundation is strong enough to leverage technology to do your bidding. If you’ve made it this far, give yourself a pat on the back!

    I’m sure a lot of you want to learn more about other domains in computer science. From here you can learn about core-CS areas like databases, operating systems, distributed systems, computer networks, and theoretical CS. In a coming post, I’ll talk at length on design patterns, software architecture, deep learning, artificial intelligence, debugging tips, what to do when you hit a brick wall, and more tips for new programmers.

    One thumb rule to keep in mind throughout your programming journey is to maintain the right attitude. You will run into problems with your code, come across bugs that seem unfixable, deal with technological changes that will stunt the development of your project, struggle with acquiring skills that seem beyond your grasp and a lot more. You will also come across people who are very difficult to work with. Remember, it’s all a part and parcel of life. Don’t get discouraged. Even the best of us run into dead-ends. Avoid analysis paralysis and take action on whatever problem you have — keep adapting till you succeed.

    Ranveer Allahbadia (BeerBiceps on YouTube) has put out a fantastic video(https://www.facebook.com/beerbiceps/videos/200171990881677/) on having a “Warrior Mentality”. Personally, this has helped me stay unfazed by difficulties in life, cultivate gratitude, and stay grounded in the toughest of situations.
    Part I to IV: All Resources(https://www.evernote.com/l/AixA04GX2kRIibxSshACY9KmkWMa7kkY_NA)

    Personal Note

    I was 14 when I first learnt how to code. I did it for fun because I loved making computers do what I wanted. Just like many other kids in this country, I was put into the IIT-JEE rat race. The general consensus by educational “experts” at that time was to “study for JEE and your life will be set.” Like every naive kid at that age, I bought into the propaganda and quit coding. During the next six months, I came to terms with the nonsense that was fed to me and tons of other kids in this country. I quickly backtracked and began focusing on doing what I love instead of blindly following the rat-race. Fortunately, I am blessed with parents who supported me wholeheartedly in this, even though it took some effort from my end to convince them. I had to show them that my intention was to work hard, be accountable for my actions, and crush my goals. I wanted to do things my way. As a matter of fact, I barely studied for my 12th boards, because I knew how meaningless it was. At that age, it was about trusting my gut and doing what I believed in. You have to give yourself time to grow, make mistakes and not fear the outcome of what will happen.

    Here’s how I saw it: if I listen to all the propaganda fed to me and I fail, I cannot blame anyone for it. Instead, I’d rather do things my way and even if I fail, at the end of the day, I’d know for sure that my failure was the result of my own actions — I consciously took action and can correct myself. I am 100% accountable for my own actions. There are times where I’ve bunked lectures for an entire week and worked 24/7 for the entire week building my skills — only to be guilt-tripped by professors who honestly had the best intentions in mind but weren’t aware of the effort I was putting in.

    Look, I’d definitely follow the system if it got me the desired results, but it doesn’t and deep inside, everyone knows that. I repeatedly asked myself: do I want to be mediocre or par-excellence? Is that the life I’d want to live a few years down the line? Will doing this make me happy in the long run? I couldn’t escape the system nor could I beat it, because it’s too complex a machinery to do so. The only way to deal with it was to work my way around it. Today, when I look back and look closely at the current scenario, I would 100% not do anything differently.

    To the younger lot reading this: I’m not asking you to completely ditch your studies. You have to graduate and get a degree, but understand that there are things apart from that certificate that matter more in life. So spend some time cultivating them.
    下载开源日报APP:https://opensourcedaily.org/2579/
    加入我们:https://opensourcedaily.org/about/join/
    关注我们:https://opensourcedaily.org/about/love/
  • 开源日报第474期:《统一图标 RemixIcon》

    2 7 月, 2019
    开源日报 每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,坚持阅读《开源日报》,保持每日学习的好习惯。
    今日推荐开源项目:《统一图标 RemixIcon》
    今日推荐英文原文:《Learning to program is a great way to improve yourself and grow your career. Here’s why!》

    今日推荐开源项目:《统一图标 RemixIcon》传送门:GitHub链接
    推荐理由:一套可以用于各种地方的开源图表库。它的特点就在于所有的图标都按照一个规范进行设计,所以看起来风格都十分相近,而且放在各种地方都没有违和感,在同个页面需要用到很多图标时可以保持页面看起来风格一致。不过因为要遵守规范所以要在图标这方面本身进行贡献兴许不太容易,不过提供新的需求或者帮助他们完善搜索标签等其他的贡献方式一样可以让热心的小伙伴帮助建设这个项目。
    今日推荐英文原文:《Learning to program is a great way to improve yourself and grow your career. Here’s why!》作者:Aditya Patange
    原文链接:https://medium.com/@AdityaPatange/learning-to-program-is-a-great-way-to-improve-yourself-and-grow-your-career-heres-why-5cc8276453fa
    推荐理由:编程是个好技能,在各个方面它能帮上你的工作的同时,也能改变你的主观世界

    Learning to program is a great way to improve yourself and grow your career. Here’s why!

    Welcome reader.

    Now that I have successfully convinced you to click the link I put out, you can be assured that that in the next 7 minutes of reading this article, you will have valuable insights to take away into your daily life.

    Don’t you want to change the world? Carve out a niche that is your own? (Source: www.etsy.com)

    This post is primarily for you if;

    You are between 13 to 19 years of age and confused about making a career choice

    After reading this article you will have substantial evidence that programming is a valuable skill to invest time in irrespective of what you want to ultimately do in life. That will help you decide fast and take action to achieve your goals.

    At this age, your time is best spent investing in your personal growth because few years down the line, you will be better equipped to deal with the real world. I started programming at the age of 14 and can confirm this, the benefits of starting early were tremendous. I want to encourage more young folks to do the same and reap the same benefits as me.

    You are already creating value in your field of interest

    This includes entrepreneurs, employees, business owners, artists and other professionals. I want to stress on the fact that learning to program will not only make you smarter but will also make you valuable asset in your area of work. Whether it is generating more revenue for your business, starting a company, getting a promotion, switching careers or simply improving the quality of work you do, you will become smarter and your perspective of the world will change for good.

    As an entrepreneur who knows to code, I am not inconvenienced without a full-fledged tech team in early stages of projects I work on and can quickly bring my ideas to life. I can communicate with my clients better, understand problem solving, time-cost-performance trade-offs, prototyping, design thinking, latest disruptive trends, scalability, engineering principles and a lot more that’s required to build a great product. Much of which I learnt through my coding experience. A large chunk of my time can be devoted to developing other aspects of becoming a successful entrepreneur. I can focus on the heavy-lifting instead of worrying about learning the ropes.

    You just want to change the world!

    Then there is no better place to be at right now. Just dive in and keep reading.

    So here is how it works, if you want to make the computer do something, you need to tell it what to do in the form of instructions (or code) that are specified in a programming language. Think of it as a way to communicate with machines. You can learn to program without learning the basics of Computer Science, but that is not very useful. When I refer to programming, what I inclusively mean is having Computer Science knowledge and knowing how to express instructions for the computer in a programming language.

    Keeping that in mind, here are some reasons why you should learn this highly coveted skill;

    1. Programming sharpens your thinking

    Thinking like a programmer means thinking algorithmically and learning to break problems down. This makes you smarter because you learn the art of identifying patterns amidst the chaos life throws at you. It’s an exercise that repeatedly trains your brain to spot patterns, which in turn improves your decision making skills and your ability to approach problems that come your way. Deconstructing problems becomes second nature and you end up doing it unknowingly all throughout your life.

    Programming is a great way to learn to think deeply and clearly

    There is plenty research and evidence to prove that programming develops different parts of your brain and enhances your cognitive abilities.

    2. It is a great way to utilise technology for impacting lives

    Technology has subtly but intricately shaped the way our lives unfold. Today, computation has evolved to the point where we end up using some form of a computer more than 15 to 20 times a day without even knowing it! While this has solved a lot of problems, it has also created and shed light on new interesting and exciting problems. Being technologically averse and primitive in your thought process is akin to taking backward steps.

    Source: Goalcast

    As a programmer, you learn how to befriend technology and leverage it correctly to solve these problems. All of a sudden, you can create ripples of change and positively impact lives.

    3. You can make a lot of money

    If you’re reading this, chances are you want to get rich and live a better life. Let’s face it, money buys comforts, opens up new avenues and makes it possible to meet your daily needs.

    Technology has revolutionised global economies and the largest companies today, in terms of market capital use technology heavily. There is a sea of opportunities out there for you to make money if you know programming.

    If you come from another field and have no interest in becoming a Software Developer, that’s fine. Knowing to write simple programs to automate your work, analyse data and develop solutions for solving pain-points in your area will take you miles ahead. If you specialise in fields like finance & banking, biotechnology, sales, marketing and healthcare, the scope of creating a social and/or economical impact in these areas is limitless. There is also an upcoming area called LawTech that focuses on automating and speeding up operational tasks done by lawyers.

    4. You don’t need a degree to make an impact

    Computer Science and Programming is an area where your degree doesn’t matter much, unless you want to get into academia. You can learn from tons of blog-posts, videos, online courses, coding platforms and other resources on the Internet created by some of the finest in the field. Not to mention, the wide range of quality books that you can refer to, to deepen your understanding.

    There are so many right and wrong ways to be a good coder and a degree course is not enough to stay well informed. The burden is on you to figure out what works and what doesn’t by practising regularly. So if you don’t have a degree in Computer Science, it does not matter. You can still avail all the free resources out there and be as good or even better than those with a formal degree.

    Do you know that Google, IBM, Apple and many other tech-giants are hiring programmers without degrees?

    5. The stereotype is nonsense — You can be anything you want

    The reason I talk about this is because a lot of young people out there have false notions that being a programmer means being a nerdy introvert who spends all day in front of a computer.

    Doesn’t paint a great picture, does it? I know a lot of programmers who excel at work and are also part-time artists, work devotedly towards their fitness goals, run side businesses, enjoy partying & socialising with people and live completely normal lives without compromising on their ambitions.

    Brandon Tory: Senior Software Engineer & Rapper (Source: Instagram)

    Brandon Tory has inspired me in that sense. I realised that my interest in rap and programming were conflicting because of the programmer stereotype that was imposed on me as a result of societal conditioning. Being a programmer has nothing to do with who you are as a person.

    There are certain groups of people who will try to put you in a box from time to time, ignore their chatter and do whatever is in your best interests. 😉

    To sum it up

    By now I hope you are thoroughly convinced that learning Computer Science and programming is a great addition to your repertoire of skills. If you are not, then remember, all the claims I have made are backed by evidence.

    Now you may have a lot of very valid questions like;
    • Ok, I am convinced that I need to learn to code. What do I do next?
    • I know to program, but I don’t have any of the abilities you mentioned. Why is that?
    • How can I balance my career and learn programming at the same time?
    • Which programming language is the best to start out with?
    • I hate mathematics and cannot stand it one bit. I have heard programming requires math knowledge. What should I do?
    • As a student how can I kick-start a side hustle and make money using my coding skills?
    Don’t worry, I won’t leave you hanging. The above questions and many more will be addressed in upcoming posts. Fortunately, your progress will be much faster than me because I’m here to guide you.

    A personal note

    The purpose of starting this blog series is not just to share information, as there is plenty available on the Internet. The intention is to share my own experiences so that people can resonate with them. My self-improvement journey started started with learning to code.

    I see a lot of young people around me struggling with depression, anxiety, no motivation, wasting time in worthless relationships with nothing in it for them and have a general lack of self-confidence which is all so solemn because they don’t realise what they are inherently capable of. This is my attempt to reach out and help them better their life and crush their goals.
    下载开源日报APP:https://opensourcedaily.org/2579/
    加入我们:https://opensourcedaily.org/about/join/
    关注我们:https://opensourcedaily.org/about/love/
  • 开源日报第473期:《妖言惑众 FakeScreenshot》

    1 7 月, 2019
    开源日报 每天推荐一个 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
    原文链接:https://medium.com/better-programming/the-one-programming-language-to-rule-them-all-620366df2805
    推荐理由:语言只是工具,大可以根据实际情况换着用,但是语言背后的基础不可忽视

    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.

    Read/watch/listen

    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.

    Practice!

    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.
    下载开源日报APP:https://opensourcedaily.org/2579/
    加入我们:https://opensourcedaily.org/about/join/
    关注我们:https://opensourcedaily.org/about/love/
←上一页
1 … 140 141 142 143 144 … 262
下一页→

Proudly powered by WordPress