一个优秀的程序员应该养成哪些好的习惯?_如何养成良好的编程习惯(2)

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

如果你想毕业后进大厂,建议好好学习算法和数据结构。学习算法和数据一定不能急功近利,算法和数据结构的知识一定要作为一个长期、持续的学习目标。如果是非科班的同学,由于没有像科班同学那样接受到系统的学习,一定要找一两本经典书籍系统地学习下常见的算法理论、思想和常用的数据结构知识。等熟悉了这块的知识,再适当地刷一些算法题目或者做一些算法练习。

对于校招或者工作年限不长的同学,面试大厂,必然有一些算法和数据结构的题目。

而且对于校招,通常这块答的不好,基本就被一票否决了。这也是我建议那些参加校招的同学要好好准备算法和数据结构的题目了。说到这里,为一些学历不错但是因为在校招前不认真准备这块、最终无缘大厂的同学感到惋惜,懒惰两个月,影响职业生涯一辈子。

大多数技术岗位算法这块的题目并不难,但是一定要在面试前好好准备一下。

另外,很多算法题其实就是《剑指 offer》上的原题。

4. 学习并掌握一门重型编程语言

如果你想成为开发高手,必须要学一门重型编程语言傍身,可以是 C/C++/Java,只会 Python 和 php、shell 等脚本语言是远远不够的。

例如对于 C++,我建议这么学:C++ 语言本身涉及到的知识点比较多,需要强调的是,既然是学习,请抛弃各种总结经验技巧的面经,逐个掌握 C++ 语言的各个知识点,包括但不局限于:

  • 指针和引用的概念
  • 指针与内存关系
  • 程序编译过程,静态链接库和动态链接库
  • static、const、#define的用法和区别
  • C和C++区别
  • 内存中的栈和堆分配
  • 面向对象理解
  • 访问限定符 public/protected/private
  • 构造函数/析构函数/拷贝构造
  • 多态
  • 虚函数与纯虚函数、虚函数实现机制、虚函数表
  • 继承原理、虚继承、菱形继承
  • new/delete和malloc/free
  • 重载、重写和覆盖
  • 类型转换方式
  • RAII 与 pimpl 惯用法
  • 内存溢出和内存泄漏
  • STL标准模板库
  • 迭代器、空间配置器理解
  • 常用容器特点、用法以及底层实现(vector、list、deque、set、map、unorderedmap)

内容有点多,只有理解了,才能记得住,关于 C++ 语言背后的实现原理可以看看侯捷老师翻译的《深度探索 C++ 对象模型》一书。

想掌握一些常用的 C++ 编码技巧,推荐阅读《提高C++性能的编程技术》,这本书很薄,但是内容都比较实用,看起来比较轻松。

C++11/14/17 新标准也慢慢成为主流,这块也要熟悉,要熟悉新标准常用的语法与新功能,包括:另外,时至今日,你一定要熟悉 C++11/14/17 常用的语言特性和类库,这里简单地列一下:

  • 左值/右值/std::move/std::forward
  • 统一的类成员初始化语法与 std::initializer_list
  • 注解标签(attributes)
  • final/override/=default/=delete 语法
  • auto 关键字
  • Range-based 循环语法
  • 结构化绑定
  • stl 容器新增的实用方法
  • std::thread
  • 线程局部存储 thread_local
  • 线程同步原语 std::mutex、std::condition_variable 等
  • 原子操作类
  • 智能指针类
  • std::bind/std::function C++11/14 网上的资料已经很多了,C++17 的资料不多,重点掌握的还是 C++11 引入的各种实用特性,这就给读者推荐一些我读过的书:
  • 《深入理解 C++11:C++11 新特性解析与应用》
  • 《深入应用 C++11:代码优化与工程级应用》
  • 《C++17 完全指南》
  • 《Cpp 17 in Detail》

另外,Effective C++ 系列的作者 Scott Meyers 又写了本介绍现代 C++ 各种技巧和避坑指南的书《Effective Modern C++》,这本书也不错,推荐一下。

5. 熟悉编程语言相关的开发工具链,熟悉调试方法,掌握技巧

熟悉该语言的相关的 IDE 开发环境,如果是 C++ 开发,Windows 上我推荐 Visual Studio,Mac 上可以使用 Subline 或者 VSCode,如果你最终的程序需要在 Linux 跑,你需要熟悉 cmake/make/gcc/g++/gdb 工具链,vim 的基本操作也要熟悉。

建议掌握:

  • 如何启动和结束调试
  • 如何添加/删除/启用/禁用断点(包括普通断点、条件断点和数据断点)
  • 如何查看当天断点下的调用对战
  • 如何查看程序运行过程中的线程信息(这块可以放到下文再学)
  • 如何查看某个变量的内存值

如果你学习的是 Linux C++ 开发,学会用 GDB 调试 C 和 C++ 程序很重要。熟练掌握 gdb 调试等于拥有了学习优秀 C 和 C++ 开源项目源码的钥匙,只要可以利用 gdb 调试,再复杂的项目,在不断调试和分析过程中总会有搞明白的一天。

掌握了一门编程语言加其开发的工具链,你的想法就可以通过动手变为现实了。

6. 学习操作系统原理和常用 API 接口

学习操作系统常用 API,操作系统的 API 在相当长的时间内都会保持不变,或者向后兼容,学习一次受用无穷。

对于 Linux 系统,我入门的时候看的是 Robert Love 的《Linux 系统编程》,这本书介绍了 Linux 系统上常用的 API 函数和背后的原理。Robert Love 是 Google 的工程师,他也《Linux 内核设计与实现》一书的作者。

Windows 系统 API 学习,我推荐《Windows 程序设计(第五版)》和 《Windows 核心编程》。

1. 学习操作系统 API 也包括学习多线程编程

这块与上文有一点重叠,我们再次说一下。多线程知识,你需要掌握理解线程与进程的关系、熟练使用常用的线程同步技术。推荐的一种学习方式,就是找一个开源项目,使用调试器跑起来,然后看看这个进程有多少线程,每个线程在何时被创建,每个线程的作用是什么,线程之间如何通信的。这也是上文建议你熟练掌握调试器的原因。

推荐看游双的《Linux 高性能服务器编程》多线程相关章节,了解操作系统提供的常用多线程同步原语。

2.学习操作系统 API 也包括熟悉操作系统原理

操作系统原理无论是面试还是自我提高的五大基础之一,我的建议学习操作系统知识时,不一定要看完所有操作系统书籍,但一定将一些基础概念(如进程、线程、内存模式等)看懂、理清。Tanenbaum.A.S《现代操作系统》是一本讲解操作系统理论不错的书,作者 Tanenbaum.A.S 是 Linux 内核创始人 Linus Torvalds 的老师。

你如果还有时间强烈推荐看看俞甲子的《程序员的自我修养:链接、装载与库》。这本书同时涉及到了 Windows 和 Linux 两个操作系统平台,用各种辅助工具剖析了程序从源码到二进制文件再到装载到进程地址空间里面的各个细节,甚至连进程地址空间中的堆结构、栈结构也分析得清清楚楚,同时也分析了 C Runtime(CRT)、glibc 这样的操作系统接口库的原理和执行逻辑,是一本实实在在帮你实战操作系统原理的好书。

当然,学有余力的同学,可以进一步了解一些关于操作系统的模式(如实模式、保护模式)、系统的启动与初始化、虚拟内存与物理内存、内存分表分页机制、进程与线程的调度算法等知识。

想要做好开发必须要学习操作系统的原理。学习操作系统原理不一定要看完所有操作系统书籍,但一定将一些基础概念(如进程、线程、内存模式等)看懂、理清,否则稍微复杂点的 C++ 程序还是会无从下手,这里推荐Tanenbaum.A.S《现代操作系统》。

从一个 .cpp 文件到可执行程序,经历了哪些阶段,每个阶段做了什么事,可执行文件里面有什么,可执行文件如何被装载到进程地址空间变成可执行的进程的,这些是 C++ 开发者要搞清楚的。强烈推荐看看俞甲子的《程序员的自我修养:链接、装载与库》,这本书同时涉及到了 Windows 和 Linux 两个操作系统平台,用各种辅助工具剖析了程序从源码到二进制文件再到装载到进程地址空间里面的各个细节,甚至连进程地址空间中的堆结构、栈结构也分析得清清楚楚,同时也分析了 C Runtime(CRT)、glibc 这样的操作系统接口库的原理和执行逻辑,是一本实实在在帮你实战操作系统原理的好书。搞 C++ 开发,不看这本书,学尽 C++ 也枉然。

6. 学习汇编

如果你熟悉汇编,你就比其他人多很多优势,你会能透彻地知道你写的每一行 C/C++ 代码背后的机器指令的效率。无论是做安全工程还是自己技术提升上都是非常不错的。这里推荐一本王爽老师的《汇编语言(第 3 版)》,这本书不厚,语言通俗易懂,你也不用刻意去记忆,基本上当小说书看一下就能很快看完了。汇编实战类图书还有另外一本《老码识途:从机器码到框架的系统观逆向修炼之路》。我个人是非常喜欢这本书的。当年读这本书的时候,真的有一种“笑看妻子愁何在?漫卷诗书喜欲狂”的感觉。一个不懂汇编的 C++ 程序不是真的 C++ 程序员,如果你不懂汇编,你很难搞得懂 C++ 的函数调用方式,很难搞的懂栈的结构,很难搞的清楚写 switch-case 语句时,怎样布局 case 分支效率才高等等。

如果你熟练掌握汇编,你就比其他人多很多优势,你会能透彻地知道你写的每一行 C/C++ 代码背后的机器指令的效率。无论是做安全工程还是自己技术提升上都是非常不错的。这里推荐一本王爽老师的《汇编语言(第 3 版)》,这本书不厚,语言通俗易懂,你也不用刻意去记忆,基本上当小说书看一下就能很快看完了。

汇编实战类图书还有另外一本《老码识途:从机器码到框架的系统观逆向修炼之路》。我个人是非常喜欢这本书的。我上学的时候发现这本书欣喜之致,连着我在宿舍读了两个星期,将这本书读完。

7. 学习计算机网络和 socket 编程

学习计算机网络要从以下三个方面学习:

1. 学习计算机网络理论知识

计算机网络编程你需要掌握基础的如三次握手和四次挥手的过程以及各个状态值,我建议使用 tcpdump 命令实际抓下包就一目了然了,然后就是网络分层,各层的用途,重点熟悉下 TCP/IP 层相关的知识,还有就是 TCP/UDP 的区别,TCP 的滑动窗口机制、拥塞控制算法、TCP 的保序、重传、确认机制。学习这些知识的时候,一定不要死记硬背,注重理解。我近来面试了一部分学历学校非常好的同学,然而,在问到这块的知识时却大失所望。例如,有的同学只是单纯把三次握手背下来了,我稍微变通一下他就不知道怎么回答了:

  • 如果连接一个目标主机不存在的 IP 地址握手过程是怎样的?连接一个目标 IP 存在但是端口号不存在的主机又是怎样的握手过程呢?
  • A 机器上的进程与 B 机器上的进程进行网络通信,分别经历了哪些网络层。
2 学习 Socket 编程

Socket 编程你需要先掌握常用的 Socket API,包括但不局限于:

常用 Berkeley Sockets API 一览表图片

学习这些 Socket API 的时候,不是让你单纯地记忆这些函数的参数,而是掌握每一个函数的重难点。例如:

  • 如何将一个 socket 设置成非阻塞模式
  • 阻塞模式下,send 和 recv 函数行为是什么样子的?非阻塞模式下 send/recv 的返回值分别是什么?
  • 客户端发起连接时,如何主动指定通过本地某个端口号去连接?bind 函数如果端口号设置为 0 是什么行为?
  • listen 函数的 backlog 参数用途是什么?
  • 如何实现异步的 connect 函数?
  • accept 函数调用时,三次握手是否已经完成?
  • 如何实现半关闭状态?
  • nagle 算法的用途是什么?
  • select 函数的第一个参数怎么设置?select 函数的超时参数如果设置为 NULL 是什么行为?

接着要重点学习下常用的网络模型:Windows 上常用的网络模型有 select、WSAEventSelect、WSAAsyncSelect、完成端口模型;Linux 上常用的网络模型 select、poll、epoll,epoll 需要重点关注的是水平模式和边缘模式。

当然,也建议一定要理解,不要死记硬背。C++ 的同学来面试的时候,我会给他们准备如下面试题:

  • epoll 边缘模式下,某次读取了某个 socket 上的部分数据,下次是否会出发读事件?如果此时又来了一个字节的新数据,是否会触发读事件?
  • epoll 边缘模式建议尽量一次把数据读完,怎样判断当前数据已经读完?
  • epoll 边缘模式下,对于写事件应该如何处理?接着还要熟悉 TCP 协议的流式特性,如何解决粘包问题;还要掌握常见的网络协议格式,像 HTTP、FTP、POP3/SMTP/WebSocket协议的格式都建议熟练掌握。

以 HTTP 协议为例,HTTP 协议包的格式是什么样的,包头和包体如何分界的,GET 与 POST 请求的数据分别放在 HTTP 包的什么位置,如果放在包体中,如何知道包体的数据有多长。

3. 学习常用网络命令

学习了常用的网络命令,可以用来排查网络故障与定位问题,反过来,也可以加深对网络理论知识的理解,建议掌握以下命令:ifconfig、ping、telnet、netstat、lsof、nc、curl、tcpdump。

相关阅读

掌握了这些命令要做到学以致用,例如现在某个服务器连接不上,如何使用这些命令判断是自己网络的问题还是目标主机的问题;开发了一个服务器程序,手头上没有可用的客户端,如何使用 nc 命令模拟一个;或者反过来,开发了一个客户端程序,如果用 nc 模拟一个服务器端用于测试。

C++ 网络编程方面的实战书来,我推荐韩国人尹圣雨写的这本《TCP/IP 网络编程》,这本书也适合无任何 Socket API 编程经验的小白,这本书涵盖从基础的 Socket API 到高级的 IO 网络模型,有非常详细和生动的例子。

等你有了一定的 C++ 网络编程以后(熟练使用常见 Socket API),你可以看看游双的《Linux 高性能服务器编程》(没错,还是这本书),这本书能让你写出完整的 C++ 网络项目来。

8. 学习数据库操作和原理

如果你想系统地掌握数据库常用的知识点,一定不要以网上各种散乱的文章为重点学习材料,理由有二:网上的资料碎片化比较严重,对于新人来说,可能会造成盲人摸象的感觉,无法形成这块成体系的技术认知。

网上的很多数据库文章都是对诸如《MySQL技术内幕》《高性能 MYSQL》的二次理解和加工,很多文章的内容对原有数据库知识理解不到位、甚至理解出错。

学习 MYSQL 数据库,建议方法:

  • 找几本权威的数据库图书系统地学习一下,当然可以选择你感兴趣的部分,常用的数据库知识并不多;
  • 自己安装一个数据库进行操作、实践。例如,我在我的主机上安装了 MYSQL,我就可以这么练习:
Last login: Tue Jul  6 10:50:02 2021 from 106.26.160.131

Welcome to Alibaba Cloud Elastic Compute Service !

[root@myaliyun ~]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3550
Server version: 5.5.60-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show database
    -> ;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'database' at line 1
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| flamingo           |
| mysql              |
| performance_schema |
| teamtalk           |
| test               |
+--------------------+
6 rows in set (0.01 sec)

MariaDB [(none)]> use flamingo;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [flamingo]> show tables;
+---------------------+
| Tables_in_flamingo  |
+---------------------+
| t_chatmsg           |
| t_user              |
| t_user_relationship |
+---------------------+
3 rows in set (0.00 sec)

MariaDB [flamingo]> desc t_chatmsg;
+---------------+-------------+------+-----+-------------------+-----------------------------+
| Field         | Type        | Null | Key | Default           | Extra                       |
+---------------+-------------+------+-----+-------------------+-----------------------------+
| f_create_time | timestamp   | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| f_id          | bigint(20)  | NO   | PRI | NULL              | auto_increment              |
| f_msgcontent  | blob        | NO   |     | NULL              |                             |
| f_remark      | varchar(64) | YES  |     | NULL              |                             |
| f_senderid    | bigint(20)  | NO   |     | NULL              |                             |
| f_targetid    | bigint(20)  | NO   |     | NULL              |                             |
+---------------+-------------+------+-----+-------------------+-----------------------------+
6 rows in set (0.00 sec)

MariaDB [flamingo]> select * from t_chatmsg limit 5;
Empty set (0.00 sec)

MariaDB [flamingo]> 

数据库需要掌握的基础知识有:

(1)熟悉基本 SQL 操作 包括增删改查(insert、delete、update、select语句),排序 order,条件查询(where 子语句),限制查询结果数量(LIMIT语句)等

(2)稍微高级一点的 SQL 操作(如 Group by,in,join,left join,多表联合查询,别名的使用,select 子语句等)

(3)索引的概念、索引的原理、索引的创建技巧

(4)数据库本身的操作,建库建表,数据的导入导出

(5)数据库用户权限控制(权限机制)

(6)MySQL的两种数据库引擎的区别

(7)SQL 优化技巧

以上属于对开发的基本的数据库知识要求,你可以找一本相关入门级的数据库图书阅读。

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

数据库图书阅读。

[外链图片转存中…(img-qYR8idhq-1715540769442)]
[外链图片转存中…(img-kmHdjeef-1715540769443)]
[外链图片转存中…(img-7qEK4mEO-1715540769443)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 27
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值