找回密码
 立即注册
查看: 1182|回复: 20

C++ 学习或编程中「误入歧途」是怎样一种表现?

[复制链接]
发表于 2021-4-16 09:30 | 显示全部楼层 |阅读模式
最近在看《C++ Primer Plus》,今天休息时偶然看见书背面有这句话:容易误入歧途。
发表于 2021-4-16 09:30 | 显示全部楼层
提前优化:除以2非要用位移符号,而不用除法符号;不信任编译器,非要自己写Inline Assembly; 计较是不是这里会发生拷贝,参数应该用引用,还是应该指针,还是传值等;而自己其实根本没有进行Profiling,给出性能报告是不是这里有问题,就想半天这些东西,满脑子骚操作。
重复造轮子:  觉得STL性能慢,自己去实现排序,swap等;很多C++程序员都有一种蜜汁自信,觉得我才是最屌的,你们都是垃圾,我要掌控一切。
绝对C++化:觉得一切非C++的都是垃圾的,C的东西都是不好的,比如觉得工程就是不能出现宏,要想尽办法替换掉所有的宏
暂时想到这么多,时间太晚了,有空再来补充。
发表于 2021-4-16 09:32 | 显示全部楼层
脑子里想着要一次做到完美,基本上就离误入歧途不远了。其实有了基础库以后,cpp无论怎么写,手感也不会比java差太多。奈何不住很多人非要穷尽各种模板和汇编技巧,为了减少一点点虚函数/拷贝构造/运行时自省/字符串处理开销,让编译错误和开发时间都增长了十倍。
std和boost的标准库,很多时候追求的是泛用性和极致的零开销,这种风格不是一般级别的用户需要学习的对象。
发表于 2021-4-16 09:42 | 显示全部楼层
std::vector<int> v = *new std::vector<int>();
发表于 2021-4-16 09:48 | 显示全部楼层
我误入的歧途,就是励志成为C++专家。
大学得知游戏都是C++开发的(那时还没有手游、页游),便下定决心要成为C++专家。这些年把能叫上名字的C++书籍都看了个遍,《C++ Primer》、《Effective C++》系列、《STL源码剖析》、《C++编程新思维》等等不下20本。
工作几年后,我把这些书都扔了,因为我发现成为C++专家根本没什么用。
书上写的内容,大部分在工作中都用不上。与人合作开发,就必须用最简单、最容易理解的方式写代码。炫技术?对不起,别人都不懂的技术炫了也没有用。我曾用模板元编程技术写了一个库,自以为牛逼地很,但别人都看不懂,也不会去用。
工作需要的是快速出产品的能力。快速写出高效稳定易于理解的代码,高效意味着代码没有性能缺陷,稳定意味着不会宕机,易于理解意味着容易维护扩展、方便合作开发。这依赖于设计能力、算法能力、性能意识、安全意识。这些能力和C++都没什么关系。
复盘过去的经历,我可能犯了这些错误:
    陷入低水平勤奋陷阱错把手段当目标
陷入低水平勤奋陷阱
成甲的《好好学习》中提到低水平勤奋的概念:
之所以很多人很努力地学习,但是效果不好,是因为犯了低水平勤奋的毛病。把大量时间用于“技术效率”,忽略了“认知效率”。所谓“技术效率”就是应对具体工作场景和问题的方法,每出现新的问题就要学习新的知识。“认知效率”了解了问题本质、底层规律,很多新的问题其实只不过是旧问题换了一个说法而已。也就是说我们学习的时候要多问几个为什么,多思考问题本质。
我花了很多时间去学习一些所谓的“技术”,大部分由于用不上已经全部忘光了,它们不是程序员的核心能力,只适用于一些特殊的领域,你不去从事那些工作就永远也用不上。
编程语言是一种工具,它是易变的。随着工作内容的变化随时要用不同的语言。比如我的工作最初主要用C++和Lua,后来做手游又用了C#,开发一些工具经常用Python等等。C++11已经让C++用起来像另一门语言,以前学的很多用法都要修改。工具总是容易发生变化和被替代。思想和方法才有更长久的价值。
错把手段当目标
当我们制定一个长期目标时,通常会把它分解成一些阶段性的小目标。只要完成了X,Y就能实现目标Z。然而由于Z过于遥远,我们常常会忘记Z,而把X,Y当成了自己的最终目标。
我原本是想毕业后做游戏开发,由于开发游戏要用C++,就把成为C++高手作为目标。然而学好C++只是开发游戏的手段而已,还有很多设计和编程的思想通过C++是学不到的。并且即使不用C++,也可以用Java、C#做游戏。
把手段当目标是我们经常犯的一个错误。把看书多当成是知识丰富、把背单词当成是学英语、把尝试GTD工具当成是在做时间管理。为了学习手段浪费了大量的时间,却没有向目标靠近一步。
我们应该时常回顾自己的最终目标。审视自己的当前的行为能不能推进目标,如果不能,那可能是遇到了把手段当目标的问题。
总结
虽然我现在结果也不错,带过团队、做过技术负责人。但我仍为过去浪费的时间感到惋惜,明明不用付出那么多努力也能获得相同的结果。
相信大部分人都会遇到同样的坑,只有经常复盘反思才能避免。反思自己是在学习“技术”,还是在提升“认知”,反思自己是在推进目标还是在完善手段。
-----------
最后,如果觉得有用,欢迎点赞+关注 : )
发表于 2021-4-16 09:55 | 显示全部楼层
过度泛化。。。
发表于 2021-4-16 09:56 | 显示全部楼层
转载。
误入歧途的新手,经常自认为:
1 我比编译器聪明
2 我比标准库快
3 我能管理好内存
发表于 2021-4-16 10:01 | 显示全部楼层
确实有这个问题。
一、我见过的“歧途”:
    过早进入“优化”的坑,在未实现功能或未进行性能优化的时候就开始想各种优化,然后最后发现花了很多时间,功能都还没写完,或者写完优化的这点性能完全无用;无限制的使用宏,模板等,整篇整篇的代码全是宏和模板,无论这些代码是不是一次性的代码,明明一行代码可以解决的,非要用一堆模板或者元编程来实现;使用不同的C++特性,在刚写C++的前一两年的时间,写代码的的时候总想着C++的各种特性,每一行都会考虑一下可以使用哪种特性可以搞定。总是觉得自己已经释放了内存,但是逻辑嵌套很深时候又忘记了。


二、由于应用环境不同,很难断定哪里是歧途,哪里不是
C++复杂,但是效率高、功能强,用途非常广泛。
因此很难断然说哪些东西是重点、哪些是歧途。以游戏项目为例——游戏逻辑代码,不要用泛型技巧,更不要用异常处理。但是泛型用的很合适的除外。
引擎层和编辑器底层,很多大牛会使用泛型技巧实现高性能算法,如果要看懂就要研究泛型。C++写的框架可能会非常难读,特别是历史久、代码行数非常多的那种。如果语法学习上有欠缺,难度会增大很多。
90%的时间,不用考虑太底层的优化(位运算、函数调用开销、STL的内存管理之类)。但是毕竟还是有一些时候要考虑,一般是在项目需要优化的时候,先找准热点,然后针对性解决。很多游戏项目到最后,STL的内置内存管理器都替换掉了。
内存管理无论什么时候都是很重要的,但是如果一开始就既考虑内存管理、又考虑业务逻辑,对新手难度会比较大。但是这个学习和适应的过程很难定义是不是“歧途”。


三、歧途不完全是歧途
C++是一门很复杂的语言,但是人的认知是有顺序性的,当人面对一个很复杂的系统时,很难快速梳理出重点。这时候走入歧路是难以避免的,或者说——很多大牛都是走进歧途又靠自己努力思考,最终总结出重点、走出来的人。
对于想快速入行的新手,由过来人带着少走点弯路,也是合理的做法~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-4-16 10:09 | 显示全部楼层
以前写程序之后总喜欢想办法减少代码量,在保证语义一致的前提下把几条语句改成一条语句,觉得这样很酷很精简。
但是后来发现这种想法是错的,这样“精简”的代码完全不利于阅读,可能过了一段时间我自己都看不懂。
现在写代码已经不再追求代码层面的最精简。而是追求设计层面的精简+高代码可读性。为了代码可读性,多几个临时变量和函数调用的开销都是微不足道的(甚至由于编译器优化而实际上没有开销)。
发表于 2021-4-16 10:10 | 显示全部楼层
这个问题印象深刻。当初自误入loki库,对就是那个洛基同学。误入loki库之后,模板使用就疯魔了。
那种感觉,大概是学会了少林长拳,然后突然看到了侠客岛上的《太玄经》那种感觉,好高大上啊。
尼玛,居然还能这样玩模板,我也要。然后就没有然后了,勘破《太玄经》的就石破天一个人,其他高手低手都疯魔了。
现在呢,又回到最简单的写法了。唉。


就是这本神书,《模板太玄经》
想看阅读评价的,请移步亚马逊
https://www.amazon.com/Modern-Design-Generic-Programming-Patterns/dp/0201704315

2018-7-28 发布
2018-8-22 update

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-20 22:41 , Processed in 0.135067 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表