对于初级Linux C软件工程师,要想进阶成为中级甚至高级工程师,需要掌握很多技能和知识,如下:
Linux C编程是linux C软件工程师的核心技能包,也是必备技能,涉及内容比较多,需要在工作中不断学习,熟练掌握Linux C编程,对于工作得心应手。
printf是c语言中最基础的日志输出函数,初学者最早接触到的API。看似简单的函数,但实际应用中很常用,也容易犯错误。
用途和注意事项:
fopen/fclose/fwrite/fread/fflush是c语言跨平台的基础API,用于读写文件,实际使用场景如下:
open/close/read/write是系统IO操作函数,可以读写文件,也可以读写网络IO。一般网络socket读写都使用系统IO操作
IO复用是网络编程中重要的机制。IO复用有三种:epoll、select和poll。性能最高的是epoll, 也是必须要掌握的机制。
熟悉gcc编译选项、和常用链接参数非常重要,可以更快解决编译问题
遇到棘手的问题或是在增加调试日志不能查到原因时,需要使用gdb调试工具,通过查看内存状态等排查问题
UDP通信是常用的传输方式之一,掌握UDP socket编程对于开发Linux网络编程至关重要
TCP通信是常用的传输方式之一,熟悉TCP socket编程非常重要
一般的程序启动时都有参数, 熟练掌握命令行参数解析在开发新程序时的必备知识
需要掌握基础的单向及双向链表,并熟悉相应的增删改查操作。有时间需要理解下内核的双向链表,设计的比较好,理解了内核的链表的设计,可以说是掌握了C语言链表精髓。
需要掌握多线程和多进程的应用,以及线程间和进程间不同的通信方式。
在实际编程中,会用到第三方或开源的软件库,也会以库的形式向第三方提供功能模块。对于高级工程师来说,熟练掌握库的生成与使用至关重要。
作为一个软件来说,无论是客户端、还是服务端,一般都是使用状态机与事件驱动模型来实现的。深入理解状态机与事件驱动的架构是成为高级工程师或软件架构师的必修之课。
scp拷贝本地文件到目标机器
scp从目标机器拷贝文件到本地
查看监听的端口和连接的状态
判断目的IP是否可以连通,是排查网络问题的重要手段
查看进程状态及杀死进程
抓取网络报文,是linux设备或系统调试网络程序的法宝
拷贝文件
移动文件
在不打开文件的情况下,查看文件内容,查看部分内容可以使用more/less。使用cat可以快速查看文件 内容
用于统计一个文件中的行数、字数、字节数或字符数
替换文件内容
文本分析
查看网卡状态及配置网卡地址等
查找文件(可以按时间、目录等)
改变文件权限
改变文件属主
删除文件
将文件/目录归档打包
在文件中查找指定的字符串
用于分析网络报文协议,号称网络工程中的瑞士军刀,是软件工程师必备的技能
manpage是linux /unix 环境下命令与函数的帮助文档。对于没有网络或保密限制无法访问外网查询函数接口和参数使用时,man page是程序员的救命稻草。
在linux终端编程时,vim是最好用的编辑器
常用的版本控制工具有git和svn,git使用更方便,管理代码更优秀。现在代码管理基本都转向git了, 掌握git的常用命令对于软件开发会起到有事半功倍的效果。
Makefile是linux下代码工程管理工具,掌握Makefile的使用是构建大型软件工程的必要工具。
linux c程序一般在linux服务器上编译,使用vim编辑器编写代码效率较低,程序员一般更愿意在windows下编写代码.
用来远程连接linux服务器
对比文本或二进制,可以协助快速找到代码或文件差异,加快问题定位和分析
将重复命令操作写成脚本,提高效率
查找或编辑文本
tcp/ip协议包含一系列的协议,熟练掌握对于开发网络程序或分析网络问题尤其重要
算法对于一般的应用程序开发来说,使用的不多。程序员掌握冒泡、选择的基本实现就已经足够。
C++是由C发展而来,对于纯linux c开发来说,使用的不多。但需要掌握C++的基本语法,能够看懂别人写的代码并作相应的扩展。
软件工程师在实际工作中,一般需要写设计文档,也需要用表格设计测试用例,掌握基本的word和excel技巧非常有必要
能够阅读rfc英文文档或其它英文说明资料即可,要求不高
大多数软件都会涉及到数据库,服务器上mysql使用的比较多,而对于linux嵌入式设备,一般使用sqlite. 无论哪种数据库,程序员都需要掌握基本的数据库操作指令
现在远程办公比较多,熟练使用远程控制软件也是重要技能之一
linux服务器或虚拟机开启samba共享供windows用户访问的应用,对于程序员开发也是常用场景
掌握C的编码规范(缩进、对齐等), 可以使程序更具有可读性或美观性。也可以使审查代码更快速,能够在一定程序上减少编码错误
想成为高级工程师,需要有一定的架构思想和软件设计能力。要经常理解开源软件的架构设计来提升架构思想并用于软件开发实践