简介

  • 参考链接
    • C++框架/库:https://www.cnblogs.com/jiftle/p/10895260.html

Linux C/C++技术栈的一些思考

  • 参考链接
    • C++技术栈:https://zhuanlan.zhihu.com/p/80604213
  • Linux C/C++更接近底层机器,自然而言效率比Java,Python效率高的很多,但是各有各的优势。想要更深入了解操作系统,控制系统,选择Linux C/C++最好不过了
  • 最近学这个方向,过一段时间又学习另一个方向,这是兵家大忌。不管走哪一个方向,一定要沉稳,选择了就坚持走下去,除非这个技术栈没落了。

  • 大厂喜欢考:
    • 计算机组成原理
    • 操作系统
    • 计算机网络
    • 数据库
    • 设计模式
    • 数据结构
    • 算法
  • 大厂很注重基础和算法,不管走什么技术栈,都要稳扎稳打,基础打牢。
  • 大厂= 基础 + 算法 + 项目。
  • 要走能够拿得出手的项目,能够讲出:
    • 为什么要做这个项目
    • 做这个项目有什么作用,目的性
    • 用的是什么技术
    • 项目存在那些缺点
    • 那些访问还可以提高

专业术语

  • 技术栈(Tech Stack),某项工作或某个职位需要掌握的一系列技能组合的统称。一般来说,是指将N中技术互相组合在一起,作为一个有机的整体来实现某种目的或功能。
  • 指在软件开发过程中所使用的各种技术和工具的集合,包括编程语言,开发框架,数据库,操作系统,云服务等等。
  • 不同的应用场景和项目需求会对技术栈的选择产生不同的影响,因此选择合适的技术栈是保证项目开发顺利进行的重要因素之一

编程思想

  • 功能是功能,业务是业务,两者不要掺杂在一起
  • 分层和分模块
    • 分层,上一层和下一层有依赖关系
    • 分模块,模块之间是并列关系

机械臂项目

  • 设计一个或多个类,用来描述一个机械臂的物理特性和功能
    • 先完成机械臂的封装,每个功可以单独调用,这就是将物理的机器虚拟成一个对象
    • 然后对该对象提供的属性和功能进行设计,完成业务逻辑的实现
  • 维护两组中间变量:读空间和写空间
    • 读空间,是上行数据,从电机中读取当前状态,写入到中间变量,并向外提供数据,封装为read
    • 写空间,是下行数据,从外部接收指令,存储到中间变量,写入电机,封装为write
  • 读操作和写操作

  • 电机,有三种模式:速度,力矩,位置。
  • 三个元素,缺一不可

C++

  • 在C++里,所有的原生类型,枚举,结构体,联合体,类都代表 值类型;只有引用(&)和指针(*)才是引用类型

  • 流媒体开发
    • 跨平台软件开发组件
    • 深度学习模型加载,前处理,后处理,模型管理
  • 比特币

  • 下一份工作,就是要拿着现在的工作经验来谈

2022 全球C++及系统软件技术大会

陈硕

  • 程序,代码语句级的性能优化已经没多少空间,SIMD(Single instruction, multiple data)除外 –> 硬件加速才是王道
    • 买块好网卡,胜过调代码
    • https://blog.csdn.net/conowen/article/details/7255920 – SIMD等关键词简介
  • 推荐书籍
    • 程序设计实战 – Kernighan &Pike
    • 性能之巅 – Brendan Gregg
  • 编程工具
    • clang-format
    • clang-tidy
    • clang-rename
  • 建议
    • 开阔思路。编译器是一个程序,系统也是一个程序,只要是程序,就可以使用或修改
    • 逢山开路,遇水架桥。会使用工具,更会制造工具
  • 关键词
    • CPU
    • GPU
    • TPU
  • 总结:
    • 性能,靠硬件加速 – offload
    • 代码,编译器工具优化 – clang

作为一个程序员,有什么想对新人说的吗?

  • 程序员最应该钻研的是赚钱能力,业务,产品,前端,后端,ios,安卓,都要学一点,技术够用就行,然后去找赚钱的机会。
  • 切记不要钻研技术底层,好多为此花了无数的下班时间,结果还是30多岁被淘汰了,这个行业大多数工作单纯就是不需要你很牛的技术。老板只关心人力成本,你把底层设计成花也没有用。过了30每年淘汰一批,千万不要以为你能卷的过别人,如果你本身学历不高,没有大公司,大项目经历,更应该如此。

源码时代-源哥

  1. 编程重在实践,而不是只靠看书与表面
  2. 重在学习基础和原理,不要急功近利
  3. 编程的学习,重在修炼内功。技术的更新迭代很快,但是他们更新迭代的再快,也是外表的框架,计算机最基本的原理一般没怎么变化
  4. 程序员这个行业不是吃青春饭,每个行业都会讨论35岁这个坎,不仅仅程序员这个行业,如果能力不行,其实不论在哪个行业也不好混
  5. 作为程序员,不应该仅仅只关注技术,还应该跳出技术的空间,来世界发展的角度看一下世界,才能把握技术发展趋势
  6. 程序员前期要学会注重技术的积累,后期发展空间才大。既要专且深,也要广
  7. 基础越牢,你会发现计算机技术更新快并不可怕;基础不牢,你会发现你一直在学习,一直很累。

Linux C/C++ 程序员毕业工作一年多来的感想

工作和在学校写代码的不同

  • 在学校写代码,很少有规模特别大的,最多也就是几千行,代码规范全凭个人喜好,没有规范的测试,没有缺陷跟踪,持续集成。
  • 正式工作,工作面对的产品是用C/C++开发,10多年的历史,上百万行的code base。产品代码有规范的编码风格,清晰的模块划分,统一的编程范式。代码提交有严格的code review,特性功能有完整的设计文档和完整的测试用例,当然,持续集成,缺陷跟踪都一应俱全

关键的知识和技能

  • 个人感觉最重要的知识是操作系统方面的知识。工作这一年多以来最长看的书也是UNIX环境高级编程,TCP/IP协议详解,UNIX网络编程卷1:SocketAPI这三本书

  • 常见的设计模式和数据结构也是非常重要的,产品代码很多地方都体现出了设计模式的应用,依赖倒转,代理模式,观察者都是经常见到的。工作最常用的数据结构和算法有:链表,哈希,各种树,排序和状态机。在学校往往只重视了数据结构而忽略了设计模式,到了工作中就会发现设计模式在大型软件开发中的精妙之处

  • 汇编也是很有必要再复习下的,有的地方用到了内联汇编,而且调试代码也经常进行汇编级的调试

  • 至于语言方面的注意点,着重强调一下编程规范,严格按照产品的规范来,没有规定的可以参考业界公认最好的编程规范

常用工具的使用

  • 常用工具的熟练使用是高效开发的一个重要前提。高效的写代码,规范的提交,快速的调试查log,快速编写一些必要的脚本都是必备的技能。
  • 个人在工作中用到工具如下:
    • 版本管理:git
    • 代码编辑:Source Insight,Sublime, Vim
    • 产品构建:GNU Make,Gradle
    • 调试工具:GDB,Valgrind,Perf
    • 持续集成:Jenkins
    • 脚本语言:shell,python
    • 各种常见的Linux命令:grep,send,awk,find,ps…

沟通与团队写作

  • 沟通和团队写作非常重要。尤其是大项目大团队的时候。清晰的表达出自己的想法和意图,理解到位别人的想法是很重要的,因为一个feature往往是多个人共同开发的。而且,有时候还会需要额外协调资源,只是闷头搞也是不行的,沟通很重要

产品code base的快速理解

  • 这一点拿出来单独说是因为感触比较深。不同于平时自己搞项目,公司产品往往有一定规模了,而且通常都还不小。一定要学会看代码,修bug,加feature,往往都要求对已有的code base准确理解。
  • 快速理解code base的方法:
    • 有文档先看文档,然后问老员工,带着对业务的理解去看代码,最后的手段才是从代码反推业务的逻辑
    • 有一定理解后,自己推断程序运行预期,加log,下断电,看call back,看内部运行信息,验证自己的想法
  • 总之,不要上来就闷头看,不要高估自己从代码反推业务逻辑的能力。要知道,有时候别人写的代码真的没有那么容易看懂。用正确的方法才事半功倍

不要过分局限于底层

  • C/C++开发通常是系统级编程,很多知识都是长期不变的经典知识,并且很多相关开发者都有一种越靠近底层越优越的错觉,从而不愿意去了解其他知识,这绝对是不可取的。
  • 故步自封往往是落后的开始。要知道,不同场景不同问题的最佳解决方案绝对是不同的,决定收入与岗位多少的也是市场需求,所以一定要让自己觉有多方面的战斗力,用开放的心态多学习

Linux C/C++ 程序员毕业工作两年多来的感想

学习的态度和方法

  • 编程的学习路径不是完全线性的。陷入毫无头绪状态,不知从何学起很正常。在学习编程路上,要做到:
    • 遇到不明白的知识点,不焦虑有信心
    • 弄清楚道理哪里不懂,做到对症下药
    • 每次学东西不用贪多,当下够用就行
    • 长期保持学习的习惯,量变产生质变
    • 经验和思考要多总结,多记录多总结
  • 技术的积累要在专注于自己领域的同时,再有些横向拓展。例如:做Linux C/C++开发,就多专注学习Linux内核,网络,C++新语言特性,数据结构与算法等方面的知识,还有各种开发与调试中常用的工具 gdb/pref等。横向扩展就可以学习同样是linux后台开发常用的Go/Python/docker等,也可以慢慢学习当下很多的机器学习,跟着自己的兴趣走

  • 最后着重强调一点:每次学习不用贪多。平时看书看视频也好,工作中遇到的新的知识点也好,遇到一个点学一个点,练习记录总结,卡的时间太长可以跳到后面回过来再学。越是想一次掌握很多,越是学不透,学不扎实,还会损害学习的积极性。有时候理解就是需要时间的。

技术与业务的平衡

  • 技术很重要,这点毋庸置疑。技术的积累也是一个长期的系统的工程。这一点在学生时期和刚开始工作的时候大家也能够普遍的认识到。

  • 业务也同要重要,不要轻视业务,除非你马上就要跳槽。技术是服务于业务的,如果对业务没有帮助,纵有屠龙之技也无法对公司做出有用功。被提拔很快的程序员无不是出色的解决了工作中各种实际问题的,例如定位了各种疑难bug,高质量开发了复杂模块,提升了产品的性能等。所以,在工作中不要本末倒置,不要成天钻研各种虚无缥缈的东西,忽略了项目本身对人的锻炼,以及对个人价值的直接体现。要主动在工作中争取承当更大责任,给人一种技术好又出活的印象,这样才能升职加薪

  • 技术方面,数据结构,操作系统,网络看的多些,编译原理也在学习。工作中自己比较注重在项目中积累,业务针对性的自学也很好的解决了工作中遇到的问题,也得到了部门的认可。工作中遇到的技术点(code base里的,产品架构上的,定位问题中遇到的,其他同事用过的等),发现自己有欠缺的,及时补齐,有针对性的学习提高是最快的,明确知道自己哪里不足该学习什么是一件很开心的事情,并且这些技术点还能够请教同事。

技术之外的学习

  • 作为一名程序员,不能除了技术之外其他都不会。国内做技术,大概率是没办法做到退休的,人无远虑必有近忧,中年危机的预防靠的是年轻时的未雨绸缪。从现在开始,学习理财投资与欲望管理

Linux C/C++ 程序员毕业工作三年多来的感想

  • 虽说已经工作三年半,但是自己还是有很重的学生思想。对于技术,依旧是学习,练习,思考,总结的路子;对于工作,仍然是按部就班的完成任务,只是随着经验的积累,承担的工作难度与重要性增加了不少。对于未来的规划自己还没有想的特别清晰,当前的想法还是踏实的学习好技术,与此同时逐渐的去向学习如何带人带项目,向身边的技术专家和领导学习。

  • 在自己的领域技术要积累的专和深,与此同时再做到一定的横向拓展。当然,如果自己的技术领域没有前途,那么一定要早做打算。没有完美的个人,只有完美的团队。技术发展到这个阶段,复杂的产品研发靠的都是团队合作,没有个人可以cover住所有方面。把自己负责的模块特性做好,对产品整体架构和关键技术有一定的把握和见解,再适度的扩展就可以了。学习的广度和深度要把握好,一个人的经历毕竟有限,一定要找好自己的定位。这点,很多公司的路线也是这样的。

  • 今年结合工作,围绕自己的技术领域进一步学习了:Linux C/C++网络编程,Go语言等。我并没有花特别多的时间在C++的使用场景比较少的复杂特性上,学习的重点放在了业务知识,操作系统,虚拟化,分布式等相关技术,而且我觉得这才是正确的学习路线,千万不能跑偏。技术是服务于业务的,要把握好学习的重点,做好时间经历的分配

  • 工作三年多来,我对技术的学习也有了新的思考,从以前什么都想学变成了有选择的学习。围绕自己的技术领域深入研究,再横向拓展,打造自己的核心技术竞争力。当然,还是前面说的,这些要建立在自己的技术领域还有一定前途的基础上。

Linux C/C++ 程序员毕业工作四年多来的感想

  • 对技术已经没有那么狂热,学习新东西变得聚焦,甚至有点功利,少了那么一点纯粹。这种改变如此明显,以至于我看自己之前写的博客和日记都有点惊讶曾经的自己是如此的沉迷和醉心于技术。

  • 在学习上,自己变得非常聚焦,解决问题为第一优先级,并且一定会想一想自己有没有过度发散学习,以至于跑偏了。一个很明显的例子:由于很多场景需要在SSH到Linux服务器上开发,自己比较深度的使用了VIM,再也没有想着整的vim多么完美,而是着重的练习vim各种快速查找编辑操作上,把实际中最常用的几个插件给好好摸索一下。

  • 平时开始看一些人文社科的书籍,开始着重拓展非技术方面的知识,重视建设多元化的自己。