百科问答小站 logo
百科问答小站 font logo



那些编程水平很高的程序员是怎么训练出来的? 第1页

  

user avatar   guo-zhong-ming-26 网友的相关建议: 
      

我最近两年都在做内存分配库的优化,已经比google tcmalloc 快了一个数量级,大约4万行源码,应该算比较优秀的程序员了。

水平暴涨,是从某天发现chinaunix c++论坛版主有一个微线程或者协程的架构的开源库,当时std库和腾讯等公司的同类库都没有开源,读完了源码和测试代码后,突然发现c++代码原来可以这样写,std库里面从来就没有这样的方案,彻底打破了对传统c++体系的崇拜。原来大厂技术高管的c++水平这么高,代码性能如此高,大约比同类场景下的普通程序员的代码快4倍,思考的是如何做一个框架,用通用高性能的方案解决某一类技术问题,从整个体系的角度来降低编程的难度,提升整个体系的性能和效率。一次编程处处可用,框架里面附带了一些常用库,优点就是一次解决bug终身解决bug, 也不用求人改库bug。

之前都白学了,之前以为熟练掌握std库的用法就是优秀的程序员。彻底放弃对熟练掌握c++语言的追求,放弃熟练掌握c++ std库的追求,彻底摆脱对std库的崇拜,有的语言装B成了一种宗教了。

开始用体系的角度思考源码,开始重构整个高性能的编程体系和库体系,将分散的技术方案整合起来,形成一个标准的随时可用的c++库,陆续在工作中,把用到的std库全部重写了一遍,发现很多函数都是60/70年代的旧技术方案,例如std string find函数,最近几十年有很多种新算法出现,最优秀的是 two way算法,于是就使用了two way算法。发现只要按照最新的技术方案重写一遍,基本上耗时最大的几个函数都是N倍的提升,于是决定在高性能c++领域发展下去,陆续把各个常用std库都写完了。日常有看到某个优秀的新算法的介绍,就加入自己的库中,陆续积累了近十多万行源码的库,很多算法都比较新,包括多线程 wait free 框架等。

摆脱对c++语言 和 std 库的盲目崇拜后,就再也没有困惑了,就不关心语言本身了,语言只是工具而已,不关心c++的某个奇怪的写法了,主要的关注点都是如何彻底解决某一类编程问题,解决后将最优的方案保存到自己的c++库中,保持随时可用的状态,代码都用最直白最易懂的方式写,最好能够被人和机器都直白的理解,完全不玩那些过多的花样了。写完了std库的常用组件后就有很多经验值了(每个组件就几百到几千行源码,慢慢就写完了),由于对性能对质量有追求,反复的优化,实践出真知,很快就能积累一堆的技巧,这些技巧在书本上是没有的,很多就是经验,刷了很多高性能的经验值。

终于技术水平的积累已经很高了,工作中某个产品比对标的某上市公司有数量级的性能优势。某一天觉得内存分配库可以优化,动手去做后,刚写完第一个版本就比 google tcmalloc 库快了大约一倍,这个库是世界级大牛的杰作,于是感觉这块有潜力可挖,继续优化三个月后已经有一个数量级的性能提升了,准备把代码写到极限,又继续优化就想看一下真正的极限到底在哪里,又是什么样的代码。只要摆脱对c++语言std库的束缚,相信编译器,各种手段一起上,反复思考每一部分的最优解,反复重写代码,留下最优解,期间陆续写或者修改过大约20万行源码,留存4万行有效代码,在工程中学习,在实践中学习,反复测试和修改源码,让项目本身成为学校,让代码成为教材,让每次修改后的最优结果成为老师,就可以快速成长。

陆续实现了各个子方向的最优解,例如 平均1ns 开销的 thread local 算法;平均1ns开销的 jump 表跳到不同的执行函数,用于处理不同大小的内存申请;平均 2.6ns 开销的bitmap pool算法;平均几ns开销的 push / pop 多生产者/多消费者 wait free queue, 用于处理跨线程的内存释放。很多新算法都是工程实践的结果,不是刻意为之,保持开放的心态,以实事求是的态度对待江湖中的每一种说法,用代码去验证,不盲从不盲信,在实践中检验,这块实验田终于开花结果,解决了很多困扰多年的想法,验证了很多种高并发的技术模型,也在实践中证明了 wait free 无锁无等待的算法是可以实现的且非常稳定可靠,更加清晰的理解了多线程极高并发下遇到的问题,理解了实质是要解决什么问题。

在两年的实践中做过大量的测试,发现某个声称要代替c++语言的新语言的思路是错误的方向,技术原型上就是错误的,那个语言的基础库里面也有多线程bug,多线程bug的特点是: 如果代码足够快问题就会暴露,如果代码足够慢就没有问题。有的人对多线程极高并发会遇到的问题实质本身是什么完全没有理解,把锅全部甩到程序员身上,企图让大家把多线程的问题理解为只是普通程序员的锅,换个限制多的语言就解决问题了,其实就那些垃圾库根本解决不了多线程极高并发下的稳定性问题,这个问题是一个体系的问题。一堆不太懂多线程的人弄了一个号称能够解决全部多线程问题的语言,一个实验性质的语言。如果真的懂多线程,明白多线程高并发下遇到的问题的实质,就会轻松实现平均开销只有几ns的多生产者/多消费者 wait free 无锁无等待队列(实质是平淡无奇的代码),也会非常容易的理解和解决各种多线程bug。实在看不过去某语言的夸大宣传,让大家付出代价去学,学一个实质上解决不了多线程高并发问题的语言。

总之就是 多实践多写代码,不盲从不轻信,有独立的思考,刷了足够的经验值了以后,就可以成为高手。

以上


========================================================================

附录: 由于内存分配库性能过高,为了避免被人误会,下面给出了详细说明。

内存分配库 目前有开放二进制so文件,测试源码,用户手册(最新大约52页,详细介绍了整体设计方案和思路,以及很多的其它内存库没有考虑过的黑科技)下载,下载链接见后。

下面这篇大约50页,写于今年年初



这篇是核心代码刚完成时的简介,两三页,写于去年年初



测试的性能情况如下,单位均为ns, 下面是性能测试截屏。

内存分配库so文件和性能测试源码 在下列地址下载



user avatar   s.invalid 网友的相关建议: 
      

人的睡眠偏好被称为“睡眠类型”或“时型”(chronotype),具体分为早睡早起的“清晨型’(morningness),晚睡晚起的“夜晚型”(eveningness)和不早不晚的中间型,中间型占的比例可能最多,而睡眠类型一般相信是先天性加上后天环境的影响。 一般以11点睡眠为中间型的分界,题主想比较的10pm – 6am的睡眠模式属于早晨型,而2am – 10am睡眠模式属于夜晚型。

我们大脑中的下丘脑维持着人体的总生物钟,称为视交叉上核(SCN)。而人体大部分细胞器官都维持各自的子生物钟(peripheral clock)。 SCN从瞳孔接收光信息,维持大概24小时的昼夜节律,SCN通过神经系统(自主神经,autonomic nerve),荷尔蒙系统(下丘脑-垂体,hypothalamo-pituitary)等的信号(例如乙酰胆碱、褪黑素、皮质醇等)跟其他细胞器官的子生物钟沟通和同步。总生物钟SCN主要通过光线作出反应,细胞器官的子生物钟主要通过饮食和身体运动调整。 饮食包括食物质量、食物的卡路里和进食时间等都在影响子生物钟,这些饮食和运动因素称为“授时因子”(zeitgebers)。授时因子会推迟或加快大脑总生物钟的时间,生物钟的时差称为“相位偏差”(phase-shift)。所以总生物钟接收光信号后,会影响身体细胞器官的功能,而细胞器官则对进食和运动作出反应,影响大脑的总生物钟。 所以我们晚间的光线,进食时间和运动时间等,都是影响我们生物钟的“睡眠类型”的环境因素。

习惯了晚睡晚起的人都会觉得自己是夜猫子,一定是夜晚型的,相反习惯了早睡早起的一般都觉得自己是早晨型的,但其实有更科学的方法分析诊断究竟个人属于哪一个睡眠类型的:问卷方法或DLMO测试方法。问卷方法顾名思义是通过回答问卷得出量表分数,两个公认比较准确的问卷量表是“慕尼黑时型问卷.” (MCTQ) 和清晨型-夜晚型量表(MEQ),两者都有一定的准确度,但公认最准确达到是“褪黑素昼夜节律时间”(DLMO),原理是人的内源褪黑素在准备入睡前会增加分泌,DLMO是通过晚上到早上收集尿液或唾液化验评估褪黑素在不同时点分泌的状况以作出最准确的判断。有研究比对了MCTQ和MEQ跟DLMO的差异,[1]发现偏差还挺大,所以就算较为科学认可的问卷都不能准确反映人体真正的睡眠类型,我们自己猜可能就更大偏差了,也许我们不应该过早给自己下定论,自己一定就是夜晚型一定需要晚睡。光线压抑褪黑素的分泌,推迟正常睡眠时间,造成人为的“晚间型”睡眠模式,对健康造成隐患。[2]

大量研究比较过夜晚型和早晨型人群的代谢性指标发现夜晚型的人出现各种代谢性疾病更多,2015年的对照组研究,[3] 韩国的研究人员把1620名年龄在47-59岁的人群样本归类为早晨型(29.6%),夜晚型(5.9%)和不早睡也不晚睡的中间型(64.5%)。研究发现只有夜晚型的人群跟更高的代谢性疾病有关,特别是男性,夜晚型的男性患上糖尿病的风险是298%,肌肉缺乏症的风险是389%,而女性出现代谢综合征的风险也高达222%。

研究也发现夜晚型人群更容易出现胰岛素抵抗。2013年日本的一项对照组研究,[4]比对了早晨型和夜晚型的糖尿病受试者,发现夜晚型的受试者,反映中期血糖水平的HbA1c和LDL水平更高,更难控制血糖水平。

夜晚型也跟精神健康有关联性,2019年美国约翰霍普金斯大学等多家大学学者发表的研究,[5] 分析了362家学校的2.9万高中生,发现夜晚型学生出现情绪问题,行为问题的风险更高,而精神健康分数也越低,尽管考虑了睡眠时长的因素,睡眠时间越晚,出现精神健康问题的风险就还是越高。

2019年的文献回顾,[6] 也发现夜晚型的成年人跟抑郁症,药物滥用,睡眠障碍和精神障碍有关联性。

哥伦比亚大学的横断研究,[7] 也发现夜晚型的女性跟心血管疾病有关联性,夜晚型女性的心血管风险增加241%。

那为什么夜晚型的人更容易出现各种代谢性疾病和精神健康问题? 因为晚睡很多时跟不健康的饮食和“错误”的进食时间有关。 [8] 研究发现夜晚型的人晚上摄入更多的卡路里,而晚上摄入卡路里增加肥胖风险。

哈佛大学和爱荷华大学的学者在2019年发表的对照组研究,[9] 跟踪了872名受试者一年时间,得出早晨型和夜晚型受试者的饮食跟健康关系的有趣的数据。研究发现夜晚型人群在晚间摄入最多卡路里比例的,相对同是晚间型的人但晚间摄入卡路里最少比例的,肥胖风险增加5倍!夜晚型人群晚间吃碳水化合物和蛋白质多的,肥胖风险分别增加4.5倍和3.7倍,但早晨型的人没有同样的风险。

题主也问到晚上10点睡到清晨4点是否健康,其实成人的最佳睡眠时长是7到9小时,已经有大量的流行病学研究发现过短和过长的睡眠时间跟疾病和死亡率有J型或U型关系。例如青岛大学发表的荟萃分析,[10] 包括了35个研究一共150万人的样本,当中有14万个死亡案例,发现睡眠时间时长在7小时,全因死亡率最低,过短和过长的睡眠可能跟健康问题有关,最佳全因死亡全因死亡率,建议大家7小时睡眠可能可以降低死亡风险。所以一天6小时睡眠并不是最理想的。

综合上述近年的研究,人的睡眠类型有早晨型的早睡早起型,夜晚型的晚睡晚起型,和正常作息的中间型,睡眠类型受先天因素和环境因素影响,晚间光线会推迟我们的生物钟,造成人为的夜晚型睡眠类型,而夜晚型睡眠模式增加糖尿病,心血管病和精神健康风险。这些风险起码部分跟饮食模式有关,如果晚睡晚起的人可以减少晚间摄入的卡路里,实行更健康的饮食模式,研究发现可以大幅降低肥胖和代谢性风险。

参考

[1] Kantermann, T., Sung, H., & Burgess, H. J. (2015). Comparing the Morningness-Eveningness Questionnaire and Munich ChronoType Questionnaire to the Dim Light Melatonin Onset. Journal of biological rhythms, 30(5), 449–453. doi.org/10.1177/0748730

[2] Ashbrook, L. H., Krystal, A. D., Fu, Y. H., & Ptáček, L. J. (2020). Genetics of the human circadian clock and sleep homeostat. Neuropsychopharmacology : official publication of the American College of Neuropsychopharmacology, 45(1), 45–54. doi.org/10.1038/s41386-

[3] Yu, Ji & Yun, Chang-Ho & Ahn, Jae & Suh, Aly & Cho, Hyun & Lee, Seung & Yoo, Hye Jin & Seo, Ji A & Kim, Sin Gon & Choi, Kyung Mook & Baik, Sei Hyun & Choi, Dong & Shin, Chol & Kim, Na-Hyung. (2015). Evening Chronotype Is Associated With Metabolic Disorders and Body Composition in Middle-Aged Adults. The Journal of clinical endocrinology and metabolism. 100. jc20143754. 10.1210/jc.2014-3754.

[4] Iwasaki, M., Hirose, T., Mita, T., Sato, F., Ito, C., Yamamoto, R., Someya, Y., Yoshihara, T., Tamura, Y., Kanazawa, A., Kawamori, R., Fujitani, Y., & Watada, H. (2013). Morningness-eveningness questionnaire score correlates with glycated hemoglobin in middle-aged male workers with type 2 diabetes mellitus. Journal of diabetes investigation, 4(4), 376–381. doi.org/10.1111/jdi.120

[5] Gariépy, G., Riehm, K. E., Whitehead, R. D., Doré, I., & Elgar, F. J. (2019). Teenage night owls or early birds? Chronotype and the mental health of adolescents. Journal of sleep research, 28(3), e12723. doi.org/10.1111/jsr.127

[6] Kivelä, L., Papadopoulos, M. R., & Antypa, N. (2018). Chronotype and Psychiatric Disorders. Current sleep medicine reports, 4(2), 94–103. doi.org/10.1007/s40675-

[7] Makarem, N., Paul, J., Giardina, E. V., Liao, M., & Aggarwal, B. (2020). Evening chronotype is associated with poor cardiovascular health and adverse health behaviors in a diverse population of women. Chronobiology international, 37(5), 673–685. doi.org/10.1080/0742052

[8] Mazri, F. H., Manaf, Z. A., Shahar, S., & Mat Ludin, A. F. (2019). The Association between Chronotype and Dietary Pattern among Adults: A Scoping Review. International journal of environmental research and public health, 17(1), 68. doi.org/10.3390/ijerph1

[9] Xiao, Q., Garaulet, M., & Scheer, F. (2019). Meal timing and obesity: interactions with macronutrient intake and chronotype. International journal of obesity (2005), 43(9), 1701–1711. doi.org/10.1038/s41366-

[10] Shen, Xiaoli & Wu, Yili & Zhang, Dongfeng. (2016). Nighttime sleep duration, 24-hour sleep duration and risk of all-cause mortality among adults: A meta-analysis of prospective cohort studies. Scientific Reports. 6. 21480. 10.1038/srep21480.




  

相关话题

  现在 Qt 好找工作吗? 
  为什么微软不出一门像 Go 或者 Rust 的跨平台系统级语言? 
  外国人编程出错也会出现「烫烫烫烫」吗?为什么会出现这个? 
  学习 Python 很吃力,我是不是可以放弃编程了? 
  如何向外行解释产品经理频繁更改需求为什么会令程序员烦恼? 
  一行 Java 代码(以分号结束)能实现什么丧心病狂的功能? 
  写代码没激情怎么办? 
  为什么很多人不建议使用驼峰命名法,有什么弊端么? 
  如何看待 WebAssembly 这门技术? 
  Rust 1.0 有什么槽点? 

前一个讨论
普通二本院校青年教师发文章比好大学难很多吗?
下一个讨论
为啥全网都在劝退医学,比医学差的专业不是有很多吗?





© 2024-11-09 - tinynew.org. All Rights Reserved.
© 2024-11-09 - tinynew.org. 保留所有权利