31

BAT老程序员分享:Linux C/C++ 开发程序员的黄金方向和学习路线!

 4 years ago
source link: https://studygolang.com/articles/24558
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

目前从事 Linux C/C++ 开发的程序员很多,尤其是像百度、腾讯、阿里这样的大公司,他们的网站流量巨大,业务逻辑复杂,会遇到很多瓶颈,需要开发底层服务来提高程序效率,快速响应用户请求。

这些公司的 Linux C/C++ 开发属于底层开发(后台服务、算法支持等),而不是应用开发,编写的程序在后台运行,没有界面,不直接面向用户。

从事应用开发(尤其是网站开发)的程序员,工作的前几年提升很快,工资也嗖嗖嗖往上涨,不知不觉年薪就到了 30W。但是这个时候,很多人会遇到瓶颈期,如果没有成为领导,工资就长得慢了。

习惯了自我进步的程序员,怎么能让工资停滞呢,不进步就是退步呀,怎么办?领导不是每个人都能当的。

可以转底层开发呀!!!有了数年应用开发的经验,对用户、业务、交互等都非常了解了,转底层开发很容易,也知道应用层的瓶颈在哪里,明白如何在底层做优化。

底层开发比应用开发的工资要高一些,再过几年,年薪到五六十万不是问题。

ZNfQveu.png!web

当然,上面说的是努力并且聪明的程序员,还有很多程序员工作十来年了依然在做应用层的开发。

那么,这个方向到底适合不适合初学者呢?初学者肯定可以学习,也肯定能找到相关的工作,但是,如果没有应用开发的经验,个人认为只学底层开发是非常枯燥的,因为你做不出一个有趣的东西来,每天面对一堆理论,早晚吐血。

初学者可以给自己树立一个目标,做一个类似 QQ 这样的软件出来,它可以有无限的优化空间,比如:刚开始只是用 Qt、GTK+、WxWidgets、Fltk 等 GUI 库构建了一个界面,并不能发送和接受信息。增加一对一聊天功能,在这个过程中可以学习通信(socket)。同时支持多人聊天,每增加一个对话就开启了一个线程,这个过程中可以学习多线程编程。提高服务器的性能,让单台服务器同时抗住一万个人聊天,这个时候你可能就需要去优化程序了,就需要关注线程创建、调度的开销,关注通信过程中的缓存。增加群聊功能,让服务器可以给多个用户发送消息,这个时候你对通信的理解将更加深入。最后呢,你可以将多台服务器联合起来,抗住几十万人甚至上百万人聊天。

你可以自己完成这个项目,也可以组队完成,在这个过程中你将会全方位的学习 Linux C/C++ 编程。

总之,初学者要让学习过程变得有趣,不要天天研究操作系统、数据结构、算法、内存、线程进程、通信等理论,一定要去实践。

uI7zErJ.png!web

学习路线

上面说了 Linux 服务器开发的前景和学习方式,接下来再说一下学习线路。

1) 语言&工具

C语言和C++是传统的 Linux 开发的语言,需要掌握。除了基本的语法,还要玩转一套工具链。

经典的组合是 GCC(编译器)+ Make/Makefile(构建中大型项目必须的工具)+ GBD(调试器)+ Valgrind(内存分析工具)+ Vim/EMACS/Gedit/Sublime Text(编辑器)。

现在有越来越多的新项目使用 Clang/LLVM 来构建了,例如 Android NDK 已经放弃GCC,全面转向 Clang。

对于初学者来说,不要贪多嚼不烂,先学好 C/C++ 语言,掌握 GCC 就可以,Clang/LLVM 和 Golang 留着以后再学。

2) 数据结构和算法

学习基本的,了解概念就可以,很多库已经封装好了常用的数据结构和算法,实际开发中你不用从零开始,所以千万不要陷在里面不能自拔,算法是个无底洞,耗死你。记住,以后需要了可以再来回顾,不用一开始就吃透。

3) 操作系统

除了基本的 Linux 操作,还有必要了解一些常用命令;当然,这不是重点,只要你经常使用 Linux 操作系统,慢慢就会了。

内存(虚拟地址空间、内存分配策略)+ 进程线程(进程通信、线程调度、死锁) + 文件系统 + 输入输出 + 中断等才是重点。这些都是理论,要和实践相结合起来。

Zz67feM.png!web

4) 通信(Socket)

在服务器上做开发,通信是必不可少的,而且是重中之重。除了了解 TCP/IP 协议族,还要学习 socket 编程,将理论和实践集合起来。

ACE、Libevent、Libev 等知名的网络库也要掌握一两个的,毕竟在实际开发中不可能直接调用 Linux API 吧,怎么也得搞个库来提高效率。

5) 界面库

当然,在服务器领域一般不需要界面,但是掌握一个界面库会让你做出一个好玩的软件来,学以致用,提高兴趣。

Linux 下常用的界面库有 Qt、GTK、WxWidgets 等,其中 Qt 是老大。

搞 Linux 开发,操作系统原理和通信是重点,也是最难学的部分,这是你跨进 Linux 开发这扇大门的标志,不学这些即使耍流流氓。

笔者分享的C/C++学习路线图:

2IV3YfN.png!web

了解更多C/C++程序员小知识,学习并提升自己的C/C++编程技术,欢迎关注简书专栏:

C/C++进阶之道

学习C/C++,从现在开始!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK