为啥都说程序员不好

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥都说程序员不好相关的知识,希望对你有一定的参考价值。

因为程序员这个职业的工作状态不利于身体健康,要长期伏案工作,而且经常处于一种忘我的状态,自己很难控制工作时长,而且有些团队承受任务期限的压力,不得不经常加班。

所以大家都说程序员不好。

1、首先是程序员通常比较清高,心态问题,总是把自己和比尔盖茨之类的划等号,程序员的逻辑思维能力确实很强,但要成为大人物,个人简介除了天赋和努力外老天的安排才是最大的原因,毕竟首富只有一个,其实只要找到了自己飞翔的适应高度,还是可以非常快乐的生活的。

2、其次是程序员做到一个年龄段后会遇到一些问题比如结婚了有孩子了确实不能像某些比较清闲的职业那样能抽出时间来顾家,实际上很多做销售工作等其他工种的很多人都是如此情况,也非常辛苦,但程序员毕竟比较单纯一遇到和自己理想碰撞的事情就会抱怨吧。

参考技术A 程序员加班很恐怖,工作制通常是996,即早9晚9周六还要上班,晚9下班还是早的,一般到晚上十点。你想那时夜深人静了人家都休息抱着老婆睡觉了,你还在工作中,是不是很崩溃?
程序员耗脑太严重。工作中需要十几个小时大脑不停地运转。需要设计算法,不断地把代码改来改去来适应客户一天几变的需求。很多功能没有现成的解决方案,还经常遇到一些天书一样的疑难问题,bug,需要百度,google,英文论坛寻求帮助。所以英文不好的没耐心的还是算了吧,不适合这行。
程序技术日新月异,新类库新SDK每天都会推出,你需要日复一日不断地学习新技术。如最新视频解码技术,游戏引擎等等,而这些新技术可是国内没有书和任何资料的,需要你到英文官方网站去找实例看文档去学,而且老板急赶项目不会给你什么时间,一般三天就是极限了,你需要这么短的时间快速掌握一项新技术...
综上,你明白程序员为什么总要加班了吧,也知道这行不是人干的吧。为什么说程序员干到三十干不动。很简单,以这种消磨人生所有时间状态,你生命中只有加班加班工作工作学习学习,你将不能顾家不能跟朋友聚会不能再有自己一点点休闲时间,更别说谈女朋友恋爱了,以这种状态你能坚持到三十岁?我想那简直是个奇迹了。
参考技术B 其实我觉得程序员也没有不好吧,工作压力比较大而且经常加班到半夜吧,但是收入相对高啊。现在这个时代程序员很吃香的。本回答被提问者和网友采纳 参考技术C 加班无法顾家就不说了,这些很多人说。关键是程序员这份工作不太稳定,经常公司倒闭或者圈快钱就走人,什么拖欠薪资、裁员都试过了

为啥多线程应用程序通常会扩展不好?

【中文标题】为啥多线程应用程序通常会扩展不好?【英文标题】:Why would multi threaded applications in general scale bad?为什么多线程应用程序通常会扩展不好? 【发布时间】:2012-04-27 08:48:57 【问题描述】:

我目前正在考虑多线程应用程序可能无法很好扩展的原因。

我知道并且一直在与之抗争的两个原因是:

    线程间通信不好,拖慢速度 芯片上的内核数和 CPU 的内存带宽不会按比例增加。这会导致每个核心的内存带宽越慢,芯片上的核心使用越多。

还有什么问题?

【问题讨论】:

Communication between processes... 你说的是多线程 ..可能是错字/braino。我确定 OP 的意思是“线程之间”:) 好吧,要正确,我们要么坚持进程,要么坚持线程。无论如何,因为我对理论比对实际正确性更感兴趣 - 请原谅我:) 我会添加 (3) 线程都需要访问某些共享资源(例如互斥锁或硬盘驱动器等),最终他们轮流访问它,大多数线程都被阻塞了很多时候都在等待轮到他们。 【参考方案1】:

对于第 1 点),它们不一定“做得不好”,但在大多数情况下,进程/线程必须相互等待的关键部分,例如更新一些关键数据。 Amdahl 定律很好地描述了这一点。

我想补充的另一点是任务本身的可扩展性。如果任务(输入)不可扩展,那么增加处理能力(核心/线程)并不能提高整体吞吐量。例如,一个应用程序要处理数据流,但是有一个约束,不能并行处理来自同一流的数据包(由于顺序考虑),那么可扩展性将受到流数的限制。

此外,考虑到 O(1) 和 O(n) 算法之间的差异,算法的可扩展性更为基础。当然,这里的主题可能侧重于处理能力的可扩展性,而不是数据大小。

【讨论】:

【参考方案2】:

我认为,在 (1) 中,您已经确定了可能对多线程应用程序的性能产生负面影响的最重要因素之一。特别是。谷歌“虚假分享”。

(2),但是只影响一组多线程应用程序 - 那些并行运行 CPU 绑定线程的应用程序。如果一个应用程序使用了很多 I/O 绑定的线程,那么 (2) 并不重要。

看我这里的盒子,它有 100 个进程和 1403 个线程,CPU 使用率 3%。 100 个进程中只有 7 个是单线程的。因此,大多数应用程序都是多线程的,但 I/O 等待。

目前,如果它只有一个核心,我的盒子会很好地工作。当然,点击一个打开我的浏览器的链接可能会稍微慢一点来打开一个复杂的页面,但不会慢很多。

在最常见的情况下,应用程序是多线程的,以利用抢占式多任务程序的高 I/O 性能,应用程序的扩展性确实非常好,即使在单核 CPU 上也是如此。

尽量不要陷入认为抢先式多任务操作系统都是关于“并行执行 CPU 密集型任务”的陷阱——它们实际上通过强制需要锁定、同步、信号等来使这变得困难。更多的是关于高性能 I/O,这是协作调度程序非常不擅长的。

【讨论】:

谢谢!要点,当您谈论调度程序时特别有趣 我使用的最后一个协同调度的操作系统是 Win 3.1 :((( 每次我听 Florence 和 'Dog days are over' 时,我都会想到 Win 3.1,'Shake it out'-> Win 95, 'Remain Nameless'-> Win ME。Windows 框在 NT/W2K 中变得有用 - 完全优先的抢占式调度程序。【参考方案3】:

许多多线程应用程序都是围绕“一个用户一个线程”概念构建的,这意味着一旦需要处理用户或杂务,就会为任务分配一个线程。每个额外的线程都会增加调度程序的负载,直到所有处理都完成并试图确定此时应该运行哪个线程。将此称为“调度程序饱和”。

Windows(多线程引擎,而不是 95/98/Me 等)有一种称为 I/O 完成端口的机制,它建议每个处理器一个线程以获得最佳性能。基于 IOCP 的应用程序通常非常快,但与往常一样,瓶颈反而出现在其他地方,例如耗尽某些类型的操作系统内存或在通信介质上等待。

你可以在这里搜索IOCP,它有自己的标签。

【讨论】:

【参考方案4】:

我会补充:

    线程越多,它们在 CPU 缓存中的份额就越小。典型的现代 CPU 可能具有 3 级缓存:L1、L2 和 L3。 L1 可能是该核心专用的,但 L2 和 L3 可能在芯片上的核心或其他东西之间共享。因此,单个线程可以使用整个 L2 和 L3,但如果您有很多线程,那么您会获得更多的缓存未命中,具体取决于您的算法配置文件。

另见:

many-core CPU's: Programming techniques to avoid disappointing scalability

【讨论】:

【参考方案5】:

它可能受到主内存的固定最大带宽的限制,您的程序已用完内存带宽,但是您使更多线程无法创建更多可用内存带宽。这与您的特定应用程序有关,无论是内存限制还是计算限制,请参阅roofline model。

【讨论】:

以上是关于为啥都说程序员不好的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用有状态的 Web 服务是不好的编程,为啥会被允许?

为啥多线程应用程序通常会扩展不好?

为啥从代码中调用事件处理程序是不好的做法?

为啥控件的类名不好?不能创建新的 GDI 句柄?

MFC中CDialog 的OnKeyDown()为啥不好使?

为啥使用 exit() 被认为不好? [复制]