An Open Letter to Those Who Want to Start Programming was published by Moonlight on June 12. My friend (whose ID on this site is Mailper) told me that He would like to see a more operational article on Cool Shell. Since he also loves programming and technology, I asked him to summarize some of his Python and Web programming experiences. So he sent me some of his thoughts and experiences, and I made a few changes to his thoughts and added a section called “Advanced” based on my experience. This is an article written by a novice and an old guy like me based on our experiences.

My friend called this article “Build Your Programming Technical Skills”. I really don’t know how to translate it in Chinese, but when I was writing it, I thought it was like a process of playing an online game and upgrading tasks, so I called it “Technical Training Guide”. The title was a bit big. Hehe, this title is purely for fun. I’m just sharing Mailper’s and my own learning experiences here. (note: saves I had learned some of the technologies as a beginner, now obviously out of date, such as: Delphi/Power builder, also saves I learned some I feel boring technology Lotus) Notes/ActiveX/COM/ADO/ATL/.NET…

preface

Do you feel like you made little toy programs when you graduated from school?

Advice:

  • Don’t buy books, don’t chase new technologies and new terms,

    The basic stuff is built up over a long period of time and will be in use for at least the next 10 years.

  • To understand what tomorrow will be like, take a look at the history and the development of technology on the timeline.
  • Do it. No matter how simple the example,

    I suggest at least doing it by hand to see if you understand the minutiae.

  • You have to learn to think about why you’re doing this, not that. You have to think about analogies.

Note: You may be wondering why the following is very Unix/Linux oriented. This is because I think programming for Windows is going to have a very bad future for the following reasons:

  • The current user interface is dominated by two things, 1) the Web and 2) mobile devices, iOS or Android. The Windows graphical interface is no longer popular.
  • More and more enterprises are building their systems with low-cost, high-performance Linux and various open source technologies, and Windows costs too much.
  • Microsoft things change too fast, they don’t last long, they just play the programmers. See The History of the Windows Programming Revolution for details.

So, I personally think the trend is Web+ mobile front end, Linux+ open source back end. Windows is basically nothing on the development side.

Call waiting welfare

1. Recently sorted out 20G resources, including product/operation/test/programmer/market, etc., and Internet practitioners [necessary skills for work, professional books on the industry, precious books on interview questions, etc.]. Access:

  • Scan the code of wechat to follow the public account “Atypical Internet”, forward the article to the moments of friends, and send the screenshots to the background of the public account to obtain dry goods resources links;

2. Internet Communication Group:

  • Pay attention to the public account “atypical Internet”, in the background of the public account reply “into the group”, network sharing, communication;


Author: Atypical Internet


Link: https://juejin.cn/post/6844903570586271758


Source: Nuggets


Copyright belongs to the author. Commercial reprint please contact the author for authorization, non-commercial reprint please indicate the source.

Introduction to the enlightenment

Learn a scripting language, such as Python/Ruby

It frees you from the fear of the underlying language. Scripting languages allow you to quickly develop small programs that you can use. Practical projects:

  • Work with text files, or CSV (python CSV, Python Open, Python SYS) read a local file, line by line (e.g. Word count, or work with log)
  • Traversing the local file system (sys, OS, path), for example, writing a program that counts the size of all files in a directory, sorts them by various criteria and saves the results
  • Working with a database (Python SQLite), write a small script to count the number of entries in the database
  • Learn to debug in simple and crude ways like print
  • Google (phrase, domain, use reader to follow tech blogs)

Why learn scripting languages, because they are so convenient, many times we need to write a small tool or script to help us solve problems, you will find the formal programming language difficult to use.

2. Be familiar with a programmer’s editor (not an IDE) and basic tools

  • Vim/Emacs/Notepad++, learn how to configure code completion, appearance, external commands, etc.
  • Source Insight (or CTAG)

These things are not used for Cool, but these editors are faster and more efficient at viewing and modifying code/configuring articles/logs.

3. Familiar with Unix/Linux Shell and common command lines

  • If you use Windows, at least learn to use Linux on your virtual machine. Vmware Player is free, so get Ubuntu
  • Be sure to use graphical interfaces less often.
  • Learn to use MAN to view help
  • File system structure and basic operation ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip…
  • Learn how to use some text commands sed/awk/grep/tail/less/more…
  • Learn how to use ps/top management commands/lsof/netstat/kill/tcpdump/iptables/dd…
  • Learn about configuration articles in /etc, system logs in /var/log and system running information in /proc
  • Learn about regular expressions and use them to find files.

Unix/Linux is much easier for programmers than Windows. (See my CSDN post from four years ago, “Unix is Simple.”) Learn to use Unix/Linux and you will find that the graphical interface can be quite difficult to use at some point, which can be quite inefficient.

4. Learn Web basics (HTML/CSS/JS) + server-side technology (LAMP)

The future is definitely a Web world, and the best site to learn the basics of the Web is W3School.

  • Learn basic HTML syntax
  • Learn CSS how to select HTML elements and apply some basic styles (keywords: Box Model)
  • Learn to use Firefox + Firebug or Chrome to see the structure of a web page that you think is cool and change it on the fly.
  • Learn to manipulate HTML elements using Javascript. Understanding DOM and dynamic web pages (oreilly.com/catalog/978…) There are free chapters online, and that’s enough. Or see DOM.
  • Learn to debug Javascript code in Firefox + Firebug or Chrome (set breakpoints, view variables, performance, console, etc.)
  • Configure Apache or Nginx on a machine
  • Learn PHP, let background PHP and front HTML for data interaction, form a preliminary understanding of the server corresponding browser request. Implement a form submission and display function.
  • Connect PHP to local or remote database MySQL (MySQL and SQL)
  • Completed a network programming course at a prestigious university (e.g. www.stanford.edu/~ouster/cgi…) Don’t feel like you need more than a semester. College students are full-time and take 3-5 courses a semester, so you can definitely keep up in your spare time
  • Learn a javascript library (such as jQuery or ExtJS) + Ajax (asynchronously reading a server-side image or database content) +JSON data format.
  • Finish The first four chapters and you understand what happens when you surf The Internet every day with a browser. (Proxy, Gateway, Browsers)
  • Make a small website (for example: a small message board, support user login, Cookie/Session, add, delete, change, search, upload picture attachment, paging display)
  • Buy a domain name, rent space, make your own website.

In order to deepen

1. C language and operating system call

  • Learn C language again, understand Pointers and memory model, with C language to achieve a variety of classical algorithms and data structures. Recommend “computer programming art”, “Introduction to algorithms” and “Programming Abet”.
  • Study (MIT free course) Introduction to Computer Science and programming
  • Learn (MIT free course) C memory management
  • Learn Unix/Linux system calls (Unix advanced environment programming(Understand the system level.
    • Use this system knowledge to manipulate the file system, the user (to implement a small program can copy directory tree)
    • Use fork/wait/ waitPID to write a multi-process program, and use pThread to write a multi-thread program with synchronization or mutex. Multi-process multi-process ticketing procedures.
    • With signal/kill/raise/alarm/pause/sigprocmask to implement a process for more than a semaphore communication between programs.
    • Learn to program and debug programs using GCC and GDB (see my “Debugging programs with GDB”)
    • Learn how to compile programs using Makefiles. (See my Write A MakeFile with Me.)
    • IPC and Socket stuff can be put into practice at a higher level.
  • Learn Windows SDK programming (Windows programming.MFC programming)
    • Write a window to learn about WinMain/WinProcedure, and the Messaging mechanism of Windows.
    • Write some procedures to operate Windows SDK resource files or a variety of graphical controls, as well as graphic programming.
    • Learn how to use MSDN to view related SDK functions, various WM_ messages, and some routines.
    • There are many routines in this book, so don’t copy them in practice. Try writing your own.
    • Don’t get too familiar with these things, as the GUI is being replaced by the Web, but learn how to program Windows graphical interfaces. @virushuo said, “I think guIs are definitely less popular, but it’s important to fully understand how GUIs work. Including mobile device development is still a struggle without basic knowledge. Or mobile device developers must understand GUI work, or learn it in Windows, or learn it in MAC /iOS.

2. Learn Java

  • Java learning is mainly to read the classic Core Java “Java Core Technology programming” and “Java programming Ideas” (there are two volumes, I only chain the first volume, enough, because Java graphical interface understanding can be)
  • Study the JDK, learning to refer to Java API Doc download.oracle.com/javase/6/do…
  • Learn how Java, a virtual machine language, compilers and executes compared to C and Python. Think about “cross-platform” technology in terms of C, Java, Python.
  • Learn to use Eclipse, the IDE, to compile, debug, and develop Java programs.
  • Build a Tomcat website, try JSP/Servlet/JDBC/MySQL Web development. Try implementing the PHP project with JSP and Servlet.
3. Web security and architecture
  • Learn HTML5, there are a lot of online tutorials, before the cool shell also introduced a lot of, I will not list here.
  • Learn about security issues in Web development (see this sina Weibo attack and this Ruby article)
  • Learn the rewrite mechanism of HTTP Server, the reverse proxy mechanism of Nginx, fast-CGI (e.g. Php-fpm)
  • Learn static page caching techniques for the Web.
  • Learn Web asynchronous workflow processing, data Cache, data partitioning, load balancing, horizontal scaling architecture.
  • Practical tasks:
    • Create some Web animations using HTML5 canvas.
    • Try SQL injection, JS injection, and XSS attack in the Web application you developed earlier.
    • Change the previous Web application to a site built on Nginx + PHP-Fpm + static page caching

Learn about relational databases

  • You can install MSSQLServer or MySQL to learn about databases.
  • Learn the paradigm of database design in the textbook, 1NF, 2NF, 3NF…
  • Learn about database memory, triggers, views, indexes, cursors, etc.
  • Learn SQL statements and understand the concepts of table joins (see “SQL Join diagrams”)
  • Learn how to tune database queries (see MySQL Tuning)
  • Practical tasks: design a forum database, meet at least 3NF, use SQL statements to query this week, this month’s latest articles, most commented articles, most active users.

5. Some development tools

  • Learn to use SVN or Git for version management.
  • Learn to use JUnit to unit test Java.
  • Learn C and Java coding Standard or Coding Guideline. (I wrote a very simple article on C language years ago – “Programming literacy”, such things you can look up on the Internet, a lot of).
  • I recommend reading The Code Book, Refactoring, And The Code Clean Way

Senior in-depth

C++ / Java and object orientation

I personally think that learning C++, Java is easy. But the C++ learning curve is pretty steep. However, I think C++ is the most important language to learn. See two interesting articles: “confidence chart for C++ learning” and “21 days to learn C++ well”

  • Learn (MIT free course) C++ object-oriented programming
  • Read the books I recommend in “How to Learn C++ Well” at least twice (if your C++ understanding is as deep as I’ve written about C++ Virtual Table Parsing or C++ Object Memory, or the Trap of C/C++ Returning Internal Static Members, that’s great)
  • And then ask yourself why C++ is doing this and Java isn’t? You must learn to compare C++ and Java. For example, initialization, garbage collection, interfaces, exceptions, virtual functions in Java, and so on.
  • Practical tasks:
    • With C++ to achieve a BigInt, support 128 bits of plastic operations.
    • Encapsulate the capacity of a data structure, such as a hash table, in C++.
    • Encapsulate and implement a smart pointer in C++ (always use a template).
  • Design Patterns must be read once, twice, and think about the scenarios in which these 23 patterns are applied. There are two main things: 1) a preference for composition over inheritance, and 2) a preference for interfaces over implementations. (Simple Design Patterns is also recommended)
  • Practical tasks:
    • Implement a memory pool using the factory pattern.
    • Use the policy pattern to create a class that aligns text files left, right, and center.
    • Implement a command line calculator using command mode and support undo and redo.
    • Implement a hotel room pricing strategy using a modifier model – peak season, service, VIP, package tour, etc.
  • Learn the use of STL and its design concepts – containers, algorithms, iterators, function children. If possible, read the source code.
  • Practical tasks:Try using a variety of object-oriented, STL, design patterns, and WindowsSDK graphic programming skills
    • Make a snake or Tetris game. Support for different levels and difficulties.
    • Do a file browser, you can browse the files under the directory, and can have different operations on different files, text files can be opened and edited, executive files are executed, MP3 or AVI files can be played, picture files can show pictures.
  • Learn some C++ class library design, such as: MFC, Boost, ACE, CPPUnit, STL (STL may be too hard, but it would be great if you could understand the design patterns and designs involved, It would be great if you could delve into my article “Copy-on-write techniques for STL String classes.” ACE requires a strong system knowledge, see “Improving system Understanding” below.)
  • Java is a true object-oriented language, and Java has as many design patterns as possible, and is the best language for learning object-oriented design patterns (see Design Patterns in Java).
  • Recommended reading: Effective Java and Java Solutions
  • Learning Java framework, Java framework is also many, such as Spring, Hibernate, Struts and so on, mainly learning Java design, such as IoC.
  • Java technology is poor, focus on learning J2EE architecture and JMS, RMI, such as messaging and remote call technology.
  • Learn how to do Web Services in Java
  • Practical tasks: Try to build a remote caller to a Web Service with a network under the Spring or Hibernate framework that can send messages over JMS between two services.

C++ and Java are not able to learn in a short time, C++ play is deep, Java play is wide, I suggest the two choose one. My personal learning experience is as follows:

  • Dig into C++ (I’ve been digging into C/C++ for over 10 years)
  • Learn various Java design patterns.

2. Strengthen system understanding

Here are some important books to read:

  • Unix Programming Arts explores design and development philosophies, cultural systems, principles, and experiences in Unix systems. You must feel a sense of enlightenment.
  • Unix Network Programming Volume 1, Sockets this is a book that you will understand network programming. Important note the differences between TCP, UDP, and multiplexed system calls select/poll/epoll.
  • TCP/IP Volume 1: Protocols – this is the book you can become a hacker after reading. Understand the operation principle of Ethernet, understand the TCP/IP protocol, operation principle and how to tune TCP.
  • Practical tasks:
    • Understand what blocking (synchronous IO), non-blocking (asynchronous IO), multiplexing (SELECT, poll, epoll) IO techniques are.
    • Write a network chat program with a chat server and multiple chat clients (the server uses UDP to Multicast or Broadcast some or all chat clients).
    • Write a simple HTTP server.
  • Unix Network Programming Volume 2, Interprocess Communication, Semaphores, Pipes, Shared memory, Messages… These techniques may seem a bit old fashioned, but it’s worth knowing.
  • Practical tasks:
    • The main practice of various IPC into the program communication methods.
    • Try writing a pipe program where a parent and child process exchange data through a pipe.
    • Try to write a program with shared memory, where two processes swap an array of C structures with shared memory.
  • Learn the book Windows Core Programming. Master CreateProcess, Windows threads, thread scheduling, thread synchronization (Event, semaphore, mutex), asynchronous I/O, memory management, DLLS, etc.
  • Practical task: Start a Notepad or Internet Explorer with CreateProcess and monitor the program. Implement the simple HTTP service we wrote about earlier with thread pools. Write a DLL hook program that monitors window closure events or records window keystrokes.
  • With the basics of multithreaded, multiprocess communication, TCP/IP, sockets, C++, and design patterns, you can take a look at ACE. Rewrite the above chat program and HTTP server (with thread pool) using ACE
  • Practical tasks:With all the knowledge above, try
    • Write a server to send a large file to the client, requiring that more than 80% of the 100 mbit/s bandwidth be used. (Note that disk I/O and network I/O can be very problematic, think about how to solve it, also note that the network transmission maximum unit MTU)
    • Understand the working principle of BT download, with multi-process way to simulate the principle of BT download.

3. System architecture

  • Load balancing. HASH, pure dynamic. (Check out Google Scholar for some articles on load balancing.)
  • Multi-layer distributed system – client service node layer, computing node layer, data cache layer, data layer. J2EE is a classic multi-tier architecture.
  • CDN system – Close access, content marginalized.
  • P2P system, research BT and donkey algorithm. For example, DHT algorithm.
  • Server backup, two-machine backup system (Live-Standby and Live-Live system), how do two machines monitor each other through heartbeat? Back up the primary node of the cluster.
  • Virtualization technology, in which operating systems can be switched or reconfigured and deployed as applications.
  • Learn Thrift, binary high-performance communication middleware that supports data (object) serialization and multiple types of RPC services.
  • Learn Hadoop. The core design of Hadoop framework is MapReduce and HDFS. The idea of MapReduce was popularized by a paper written by Google. MapReduce is simply “the decomposition of tasks and the aggregation of results”. HDFS, short for Hadoop Distributed File System, provides underlying support for Distributed computing storage.
  • Understand NoSQL database (some people say it may be a transition hype technology), but because of the ultra large scale and high concurrency of pure dynamic website increasingly become the mainstream, and SNS type website in the process of data access has a rigid demand for real-time, which makes the NoSQL database slowly become the focus of people’s attention, And has become to replace the relational database and become the future mainstream data storage mode trend. There are many NoSQL databases, most of which are open source. MemcacheDB, Redis, Tokyo Cabinet(upgraded to Kyoto Cabinet), Flare, MongoDB, CouchDB, Cassandra, Voldemort, etc.

Writing so much, looking back, I feel quite a sense of achievement. I hope you will not be scared, I myself this ten years also continue to learn, today I am also learning, life is a process of continuous learning and training. However, there must be leakage, there are wrong, but also hope that we complement and correct. Please contact me via my Weibo (@left Ear Mouse) and Twitter (@haoel).

— Updated 2011/07/19 —

1) Some people wonder why I mentioned Web + mobile at the beginning of this article, but didn’t mention iOS/Android front-end development at the end. Because I have a feeling in my heart that UI on mobile devices will eventually be replaced by Javascript. Take a look at Google + on your iPhone or Android and you’ll see.

2) Some friends say that I have too much stuff here and can’t study just for the sake of studying. I agree with them. I also talked about thinking earlier in the article. Also, don’t think I’m talking about new technology. More than 95% of this walkthrough is basic. And it’s all proven, basic technology. The technology that will get you anywhere is also the technology that will get you a good job.

3) Some friends say that if you are 40 years old after learning these things, you should think about how to make money. I want to tell you that one is that I am not 40 years old yet, two is that there is no end to learning, and three is that I don’t think it is hard to make money. The hard part is how to make you worth that much money. Whether it’s working or starting a business, what makes you and your company worth more? Elsewhere I can’t say, for Internet or IT companies, technical strength is definitely one of them.

4) the friend said that technology is a tool, should not be so obsessed with this sentence is not wrong, sometimes we need more is looked up to see outside of technology, or is said when we were in technology could not to think about why have this technology, why not other, the problem is not the technology, the problem is that we die reading, reads the book, a bookworm.

5) NoSQL is hot these days, but I’m a little conservative about it, so I’m just saying know it. With Hadoop, I think it has huge potential in distributed systems, so I need to learn it. For relational databases, it’s really important, and I missed the point and added it in the text.

Author: increasingly, blog: https://coolshell.cn/articles/18190.html