精华内容
下载资源
问答
  • 世界上最难游戏c语言代码,用简单和最好的方式实现难的游戏,极具挑战性。
  • 世界上最大的代码

    千次阅读 2017-05-27 07:17:03
    这张图显示了一个项目的 repo 有多少大,衡量的标准是代码的行数(图片太大,建议保存之后在电脑看)。 上面是一个简单的 iPhone 应用,代码行数还不到 10w,后面紧接着的是 UNIX 1.0 和 Win32 Google 的代码...

    这张图显示了一个项目的 repo 有多少大,衡量的标准是代码的行数(图片太大,建议保存之后在电脑上看)。

    最上面是一个简单的 iPhone 应用,代码行数还不到 10w,后面紧接着的是 UNIX 1.0 和 Win32

    Google 的代码库远远超过了其他项目,总共有 20 亿行。

    不过 Google 不是最大的 Git Repo,因为 Google 内部用的是自己开发的版本管理工具,可以让 Google 内部 62000 名员工(其中有 1/3 是程序员)更加高效地工作。

    最大的 Git Repo 是微软的 Windows

    • 文件数量有 350w
    • 大小有 300 GB

    还有一些大家比较熟悉的项目,他们的代码行数:

    • Chrome: 5M
    • 魔兽世界(服务端): 6M
    • Firefox: 9M
    • Android: 11M
    • Windows XP: 39M
    • Office 2013: 44M
    • Facebook: 61M

    参考:The biggest codebases in history

    转载于:https://juejin.im/post/5929208ca0bb9f0057e28e25

    展开全文
  • 文章目录小世界网络复杂网络的特性平均路径长度L聚集系数C度及度分布小世界效应规则网络随机网络小世界网络无标度网络python 代码生成小世界网络规则网络 小世界网络 [百度百科]:小世界网络模型是一类具有较短的...


    喜欢的话请关注我们的微信公众号~《 你好世界炼丹师》。

    • 公众号主要讲统计学,数据科学,机器学习,深度学习,以及一些参加Kaggle竞赛的经验。
    • 公众号内容建议作为课后的一些相关知识的补充,饭后甜点。
    • 此外,为了不过多打扰,公众号每周推送一次,每次4~6篇精选文章。

    微信搜索公众号:你好世界炼丹师。期待您的关注。


    小世界网络

    [百度百科]:小世界网络模型是一类具有较短的平均路径长度又具有较高的聚类系数的网络的总称。

    小世界网络(small-world network)是指网络中大部分节点都不彼此相邻、但大部分节点都彼此联通的网络。简单来说,就是大部分节点都不直接与许多节点连接,但到网络中其他大部分节点都有通路存在。这种现象通常在社交网络里很常见:大部分人一生的熟人圈子(社交网络相邻节点)也只有几百人这个数量级,但通常任意在社交网络中找两个人,他们之间的是存在社交通路(朋友链)的。六度理论也告诉我们在实际的社交网络中,节点之间的距离(最短路径长度)通常不会太大,也就是说街上随便找一个人,你通常总有朋友的朋友的朋友的朋友的朋友认识他。

    小世界神经网络可能是指在大脑等生物神经网络中常见的现象,即大部分神经细胞都只和临近的少量神经细胞直接接触(少量是相对于整个网络的大小),而整个神经网络是靠这种小的邻接结构联通的。神经网络里出现小世界特性的一个假说是“生物经济性(biologically economic)”,即为了让整个网络联通并有较小的网络半径(网络上最长的最短路径长度,可以认为是网络里最长的通信延迟),每个神经元只通过树突或者轴突和(相对)邻近的若干神经元联系是一种比较经济可行、节约“神经元材料”的网络结构。许多计算神经学中的稀疏权值(或局部权值)模型即来源于这种假设。

    复杂网络的特性

    目前科学家还没有给出复杂网络的严格定义。从过去十几年的研究来看,复杂网络至少包含以下几层意思:

    • 首先,它是大量真是复杂系统的拓扑抽象;
    • 其次,在感觉上比规则网络和随机网络复杂

    平均路径长度L

    在网络中,两点之间的距离为连接两点的最短路径上所包含的边的数目。网络的平均路径长度指网络中所有节点对的平均距离,她便命网络中节点的分离成都,反应了网络的全局特性。

    聚集系数C

    在网络中,节点的聚集系数是指与该节点相邻的所有节点之间连边的数目占这些相邻节点之间最大可能连边数目的比例。而网络的聚集系数则是指网络中所有节点聚集系数的平均值,它表明网络中节点的聚集情况即网络的聚集性,也就是说同一个节点的两个相邻节点仍然是相邻节点的概率有多大,它反映了网络的局部特性。

    度及度分布

    在网络中,点的度是指与该点相连的节点数目,即连接该点的变得数目。而网络的度指网络中所有节点度的平均值。度分布P(k)指网络中一个任意选择的节点,它的度恰好为k的概率。

    小世界效应

    复杂网络的小世界效应是指尽管网络的规模很大(网络节点数目N很大),但是两个节点之间的距离比我们想象的要小得多。也就是网络的平均路径长度L随网络的规模呈对数增长,即L~In N。大量的实证研究表明,真实网络几乎都具有小世界效应。

    规则网络

    最简单的网络就是规则网络,它是指系统中个元素之间的关系可以用一些规则的结构表示,也就是说,网络中任意两个节点之间的联系遵顼既定的规则,通常每个节点的近邻数目都相同。

    • 全局耦合网络(完全图)
    • 最近邻耦合网络
    • 星型耦合网络

    随机网络

    从某种意义上讲,随机网络和规则网络是两个极端,而复杂网络处于两者之间。节点不是按照确定的规则连线,如纯粹的随即方式连线,所得的网络为随即网络。如果节点按照某种自组织原则方式 连线,将演化成各种不同的网络。

    小世界网络

    规则的最近邻耦合网络具有高聚类特性,但并不是小世界网络。另一方面,ER随机网络虽然具有小的平均路径长度但却没有高聚类特性。因此,这两类网络模型都不能再现真实网络的一些重要特征,毕竟大部分实际网络既不是完全规则的,也不是完全随机的。作为从完全规则网络向完全随机网络的过渡,Watts和Strogtz于1998年引入了一个小世界网络模型,称为WS小世界模型。

    无标度网络

    很多网络(包括Internet和新陈代谢网络等)都不同程度拥有如下共同特性:大部分节点只有少数几个链接,而某些节点却拥有与其他节点的大量链接,表现在度分布上就是具有幂律形式,即P(k)~k—γ。这些具有大量链接的节点称为“集散节点”,所拥有的链接数可能高达几百、几千甚至几百万。包含这种集散节点的网络,由于网络节点的度没有明显的特征长度,故称为无标度网络。

    python 代码

    生成小世界网络

    import networkx as ne #导入建网络模型包,命名ne
    import matplotlib.pyplot as plt #导入科学绘图包,命名mp
    #WS network graphy
    print('请输入网络节点总数NETWORK_SIZE:')
    NETWORK_SIZE=int(input())
    print('请输入规则网络要连的邻接个数k:')
    k=int(input())
    print('请输入重连概率p:')
    p=float(input())
    ws=ne.watts_strogatz_graph(NETWORK_SIZE,k,p)
    ps=ne.circular_layout(ws)#布置框架
    ne.draw(ws,ps,with_labels=False,node_size=30)
    plt.show()
    

    在这里插入图片描述

    规则网络

    如果把重练概率改为0,则为规则网络
    代码同上
    在这里插入图片描述

    展开全文
  • 我回答她: 写代码世界上最好的工作, 不接受反驳! 很多行外人和业内人士都认为, 35岁以后的程序员会被淘汰 ! 写代码是碗青春饭, 年纪大了就学不动了也加不动班了! 我回答说: 这些都是误解,就像说程序员人人都会修...

    前言

    每逢金三银四 , 像作者这样的IT码农, 会按捺住内心对 996 和 产品经理 的一万种脏话, 偷偷将手中的简历更新, 投往互联网各公司的HR手中 , 这时IT论坛里也热闹起来了, 各种大厂内推和求内推的帖子被顶的火热. 有些幸运的 码农拿到了些大厂的 面试邀请, 想着大厂入职后诱人的福利, Double 的薪资, 不少年轻的码农不知不觉流下了口水, 兴奋的彻夜难眠…

    脱帽面试

    激荡风云

    据说今年毕业季找工作是地狱难度, 最近我加了个 计算机应届生 找工作的群, 青年学子们林林总总的只言片语 让我触景生情, 谁毕业时不带着 对未知的慌恐, 当年刚毕业时我也是一个小白 !

    有幸去武汉xxx研究中心的一家 IT公司面试, 拿到邀请的当晚激动的彻夜难眠, 因为这是我少的可怜的实习机会。 清晨早早的赶去目的地, 透过公交车窗看到外面的天空雪花飞舞, 我提前 30 分钟到了该公司附近, 那时的我青涩害羞 并没有到办公楼中躲雪。
    到了时间我打电话联系了面试官,刷了身份证进入办公楼, 顿时浑身冷冰冰的我置身于暖和的空调房里, 像干枯的白菊花放在了热水中说不尽的自在。

    面试官看上去和蔼可亲, 我们聊了一会, 他拿了一份 面试题给我做, 我依稀的记得上面 有一些 关于 Java 排序算法和 多表查询的SQL题目, 那时这些题目对于我来说 有点难度, 我绞尽脑汁的把这些题目做完 颤颤巍巍的交给面试官.

    我清晰的记得, 他拿到面试题时, 脸上的表情从蔼可亲变成了面目狰狞, 仿佛我浪费了他的时间。 现实与大家猜想的一样, 我做错了很多道基础的题目, 算法和SQL更是错多对少, 他不厌其烦的和我走了个过场, 勉励了我几句, 结果我信以为真, 以为抓住了救命的稻草 当晚上我用短信恳求他, 希望能加入那家公司.

    后来做了面试官 也曾有面试者对我这样 低声下气的恳求, 仔细想想其实这是对面试官的一次道德绑架, 一个资质平平的候选者, 一个需要你收拾烂摊子的同事, 谁会欢迎这样的人呢 ?

    那时的我在武汉不同的IT公司先后碰壁了 十几次后终于找到了工作, 同时也在这种求职环境中, 没有气馁 十年磨一剑 。 我现在的综合能力已经 超过了大多数面我的面试官, 不懈的努力奋斗下也让我成了 Offer 收割机, 这一切的一切都是 卧薪尝胆的结果。

    “三年不翅,将以长羽翼, 虽无飞,飞必冲天;虽无鸣,鸣必惊人!" – 韩非子

    少年 不要恳求别人, 恳求自己吧!

    当初为什么选择写代码 ?

    coding

    网传 2020年4月18号, 🧒周某人即将出狱, 广西南宁市人人笼罩🛵有车无电瓶的恐惧中, 当年 “流氓无产者代言人” 周某人的至理名言在网络上疯传 好像说什么

    “打工这方面,打工是不可能打工的,这辈子不可能打工的!”

    “做生意又不会做,就是偷这种东西,才能维持得了生活这样子,进看守所感觉像回家一样,在看守所里的感觉比家里感觉好多啦!”

    “里面个个都是人才,说话又好听,我超喜欢里面的。”

    这种言论初听很好笑, 疯传的背后也道出了很多人的无奈, 城市生活中房贷,车贷,学贷 💔压的人喘不过气, 很多人开始审视自己的未来, 前段时间有人问我 为什么当初选择写代码 ?

    我回答她: 写代码是世界上最好的工作, 不接受反驳!

    很多行外人和业内人士都认为, 35岁以后的程序员会被淘汰 !
    写代码是碗青春饭, 年纪大了就学不动了也加不动班了!

    我回答说: 这些都是误解,就像说程序员人人都会修电脑一样,
    (话说作者目前还没有组装过电脑和系统(>人<;), 但是我相信大多数人对我解释并不满意, 说什么 “大厂程序员 35岁就下岗, X厂向社会输出 10年程序员的话来”!

    主观上我认为

    我无比热爱写代码的这个工作, 假设有一天我 35岁被淘汰了, 我依然会将他当作一个兴趣就和吃饭喝水一样, 那我们不妨设想一下 自己到了35岁应该是什么样子, 在我的想象中把35岁的程序员分为 3类.

    • 当一天和尚撞一天钟型:
      • 毕业十年 换了10家不同领域的IT公司.
      • 业务领域没有深耕, 技术上不精益求精.
      • 偷奸耍滑暴怼产品经理脚踢测试运维 毫无违和感.
      • 早早成了家 背负车贷,房贷 面对任何事情不敢轻举妄动, 逢人便称 中年危机.
    • 斜杠青年型:
      • 毕业十年 早早确定方向, 选择一个领域深耕.
      • 业余深入参与开源社区, 自己做的项目也收获 1W star, 博客好评如潮, 自己就是公司的技术大拿.
      • 在需求上 主动调研, 对工作一丝不苟, 能解决技术之外的一切问题.
      • 工作之余 带队自研产品, 上线过多款 爆款 应用. 副业收入超过主业.
      • 把全部的精力放在了 事业上, 结果导致晚婚晚育 也落得个清净 (有些长辈可能要说, 世界只有剩男的不剩女的,这是反面教材云云).
    • 中层管理型:
      • 毕业十年 海归硕士 | | 985博士 的出身, 让他能在世界500强中的热门领域乱窜.
      • 业余阅读管理与生活类书籍大于技术类书籍
      • 在业务迭代上, 担任项目经理 占主导地位, 统筹全局, 说一不二.
      • 工作之余 爱到处旅旅游, 经常被邀请去各种互联网大会演说架构, 技术上也追求创新而追求稳定.
      • 百万年薪的他, 家庭美满婚姻幸福.

    看来看去好像 第一种类型的程序员 更担心被裁也更容易被裁 !

    客观上我认为

    程序员的价值 35岁 和 25岁是有着巨大的区别,
    借用陈龙的一段话.

    我觉得Web开发和汽车工业是一样一样的。

    我模仿上面这段话,分析一下Web开发啊:这是因为迄今为止,Web开发仍然是大规模生产的互联网产品之中最为复杂的。Web开发涉及到的技术非常多,以服务器端用Java为例:从前端的HTML、CSS、ES\TS、Node、Webpack、NPM、ESLint、NG\React\Vue,到服务器端的:Java、Spring Boot、Spring MVC、Spring Data\Mybatis、Spring Security\Shiro、Spring Cloud\dubbo、Maven\,到部署环境的Docker、K8s,到数据库的各种SQL或NoSQL。开发一个Web应用,细数的话,会用到十几到二十相技术或工具。

    上线以后还要经历各种用户端环境,不同的浏览器、微信小程序,不同的移动设备自适应布局。而且还要尽可能用户体验顺滑、占用带宽小。现在计算机软件业的奇迹之一就是能把这么复杂的一个东西做的可靠性如此之高,可维护性如此之好,成本还如此之低。但是,奇迹是不存在的,要造出这么个东西,挑战想当巨大。

    Web开发到底难在那?我认为最难的是”系统工程“。

    系统工程是一个跨多学科领域的工程学和工程管理,通常专注于如何设计、开发和管理在其生命周期内的复杂系统。系统工程的核心系利用系统性思考的原则,以建构其知识体系。当处理大型、复杂的专案时,所面临的相关议题(例如:需求工程、可靠度、物流、不同团队的协调、测试与评估、可维修性、和许多其他能够成就系统开发、设计、执行、和最终除役的学科)变得更加困难。系统工程借由工作流程、优化的方法、以及风险管理等工具来处理此一类型的专案,并且与技术、和以人为本的学科相互重叠(例如:工业工程、机械工程、制造工程、控制工程、软件工程、电机工程、模控学、组织研究、以及专案管理)。系统工程确保专案或系统的各个层面均被详加考虑、并整合成为一体。
    – 维基百科

    就难在要跨多种语言和框架,让多个团队协作起来。这个和造车还是一样的。如果李书福只作汽车轮胎,很容易成功。如果选择去做沙发,也很容易成功。但是去造汽车,不是轮胎+沙发那么简单,而是系统工程。生产汽车的多个部门要协调,还有市场和客户需要满足。

    Web开发也是一样,前端团队、后端团队、测试团队、再加上项目经理产品经理配置管理、最重要的还有客户甲方。

    如果是以体力来比较 35岁 与 25岁的程序员, 老程序员 体力上并不占优势, 而Bug率,技术扎实程度 上肯定要比 年轻程序员强的不知道那里去 !

    那么请问程序员是体力劳动吗? 显然不是 !
    那你说程序员不是要敲键盘吗? 难道你没听说过 轮子吗? 这一点仁者见仁智者见智 !

    对代码不感冒, 我应该怎么办?

    eureka-core

    作者也曾经有过这样的体验, 在公司完全不想写代码, 想到公司的业务都厌恶,
    那么你要重新审视下你当前的状态.

    就如我原先的一篇 <作为程序员的你 是喜欢代码还是喜欢工作 ?> 里所描述的一样, 你并不是讨厌工作而是讨厌其他东西,

    • 也许是毫无希望的公司
    • 可能是没有长进的技术水平
    • 也可能是无数改了又改的需求
    • 或者是步步紧逼的DDL(最后期限)

    接下来不会教你如何智斗 产品经理, 花式砍需求, 请看到此处的程序员花 3分钟时间, 内视下自己, 向内心深处呐喊 : “作为程序员的你 是喜欢代码还是喜欢工作?

    • 如果你喜欢代码就请去追求技术上的精益求精 不要去一个天天996 写业务代码的公司, 给自己找个对口的东家.
    • 如果你觉得你的工作能让你丰衣足食, 你才选择它, 那么我劝你转行, 35岁怀着这样的思想的你大概会成为 上述所说的第一类人 当一天和尚撞一天钟.
    • 如果你认为这两者都很重要, 那么请你 继续关注 20K+ 公众号 !

    关于职业发展

    职业发展

    1. 选择一个有前途的领域深耕, 领域具体指的是 电商,教育,金融,音视频,大数据,ML 等, 也可再细分为 ToB , ToC, ToG, ToVC等 ,作者推荐首选 ToB大数据, ToC社交电商 等, 道理很简单 这样选择符合未来趋势并可以随着公司业务发展技术得到发展. 绝对不亏 !
    2. 选择一个有前途的公司, 上面讲了领域, 没有待在一个好点的公司,领域再好也是枉然, 我心中的公司排名 增长公司 > 明星公司 > 创业公司. 增长型公司是指 饿了吗, 美团, 拼多多, 摩拜, 年轻时的它们都有一个共同标签 独角兽, 我们要学会先选择领域 再选择公司, 不要浪费青春.
    3. 创造一个开源的项目 建议这个阶段应该是你工作 1 年后, 你在一个领域深耕了很久之后, 你对开发的流程了如指掌. 这时候你就可以拿出工具箱根据现有的轮子创建出更强大的轮子, 因为你在一个行业深耕了很久你解决的问题和你造的新轮子别人也一定是需要的.
    4. 创造一个自己的产品 建议这个阶段应该是你工作 3 年后, 这时候你一定接触过很多产品, 你对产品经理的设计思路也了如指掌, 那么你就可以联合几个小伙伴 设计属于自己的产品, 比如 解决 番茄钟问题的 小程序, 解决 疫情查询的 APP , 基于自己框架开发的技术产品 等, 只要你想做, 大胆放手去干 !

    做个斜杠青年是普通人的最好出路!

    🦃 来一波干货

    我们参加面试时经常会聊到一些技术相关 英语名词, 而大多数程序员对英语发音并不感冒, 往往交谈中答非所问 搞得场面一度很尴尬, 当然这里不是叫大家立刻去学好英语, 学好一门语言, 冰冻三尺非一日之寒. 我给大家整理了一个Java相关 单词表 , 面试前复习下即可 . 临阵磨枪不快也光!

    单词美式音标技术分类语义
    abstractˈæbstrækt, æbˈstrækt关键字抽象
    breakbreɪk关键字打破
    extendsiksˈtendz关键字继承
    finallyˈfaɪnəli关键字最终
    interfaceˈɪntərfeɪs关键字接口
    instanceofɪnstanceof关键字实例
    protectedprə’tektɪd关键字受保护
    synchronized’sɪŋkrənaɪzd关键字同步
    transientˈtrænziənt关键字短暂的
    volatileˈvɑlətl关键字易变的
    ReentrantReadWriteLockrɪ’entrənt riːd, red raɪt lɑkJ.U.C可重入读写锁
    StampedLockstæmpt lɑkJ.U.C盖锁
    ConcurrentHashMapkənˈkɜrənt hæʃ mæpJ.U.C并发HashMap
    ConcurrentSkipListMapkənˈkɜrənt skɪp lɪst mæpJ.U.C并发跳跃表映射
    CopyOnWriteArrayListˈkɑpi ɑn raɪt ə’reɪ lɪstJ.U.C复制写入数组列表
    LongAccumulatorlɔŋ əˈkjumjəˌletɚJ.U.C长整型累加器
    AtomicLongArrayəˈtɑmɪk lɔŋ ə’reɪJ.U.C原子长整型数组
    Exchangerɪks’tʃeɪndʒəJ.U.C交换器
    ForkJoinPoolfɔrk dʒɔɪn pulJ.U.CFork连接池
    ThreadPoolExecutorθrɛd pul ɪɡˈzɛkjətɚ, ˈɛksɪˌkjutɚJ.U.C线程池执行者
    Spring Cloud Bussprɪŋ klaʊd bʌs微服务春天云消息总线
    Spring Cloud Consulsprɪŋ klaʊd ˈkɑnsl微服务春天云服务网格
    Spring Cloud Netflixsprɪŋ klaʊd Netflix微服务春天云服网飞组件系列
    Spring Cloud Schema Registrysprɪŋ klaʊd ˈskimə ˈrɛdʒɪstri微服务春天云注册表
    Spring Cloud Securitysprɪŋ klaʊd səˈkjʊrəti微服务春天云安全
    Spring Cloud OpenFeignsprɪŋ klaʊdˈoʊpən fen微服务春天云网飞公开虚拟调用组件
    Spring Cloud Eurekasprɪŋ klaʊdˈ jʊ’rikə微服务春天云网飞注册发现组件
    Spring Cloud Zuulsprɪŋ klaʊdˈ zull微服务春天云网飞网关组件
    Spring Cloud Stream Applicationssprɪŋ klaʊdˈ strim æplɪ’keɪʃəns微服务春天云流式应用
    Spring Cloud Hystrixsprɪŋ klaʊdˈ hɪst’rɪks微服务春天云网飞熔断组件
    ElasticSearchsɜrtʃ ɪˈlæstɪk中间件弹性搜索
    Kafka’ka:fka:中间件卡夫卡
    RabbitMQˈræbɪt mq中间件猎兔消息队列
    ActiveMQˈæktɪv mq中间件积极消息队列
    Zookeeperˈzukipər中间件动物园管理员
    Quartzkwɔrts中间件石英定时器

    扫码回复 “加群” 和我一起月入 20K+

    深入浅出分享 Java 干货 , 找回对代码的 Passion , 助力月入 20K+

    展开全文
  • 你见过烂的项目,撑了多长时间才完蛋?六个月?一年?今天介绍的这个奇葩项目,不但一开始就烂得透透的,还硬撑了12年多,直到项目负责人被逮起来丢进监狱才完事。 到底有多烂?用下面这组触目惊心的数据告诉你↓...

    你见过最烂的项目,撑了多长时间才完蛋?六个月?一年?今天介绍的这个奇葩项目,不但一开始就烂得透透的,还硬撑了12年多,直到项目负责人被逮起来丢进监狱才完事。

    到底有多烂?用下面这组触目惊心的数据告诉你↓↓

    ● 总共 600 多万行 C++ 代码

    ● 总共 50000 多个类

    ● 受编译器版本限制,用的 C++ 语法都是陈旧过时的,只能在某个(早就没有维护)的操作系统上部署

    ● 基于 CORBA

    ● 采用的数据库软件来自一家早就破产的公司

    ● 好几层互相叠加的层共同组成了用户界面,而且这些层没有一个是由原作者维护的

    ● 运行一个用户界面需要启动 40-50 个子线程

    ● 在 32 台并行的机器上需要 48 小时进行编译

    ● 没有采用运行库动态链接技术,一个可执行程序就有好几百兆那么大

    ● 启动这玩意大约需要 15 分钟

    ● 然后一般 30 秒到 30 分钟内会崩溃

    你从未见过的“地狱级”烂项目

    十年前的 2008 年,科技博客 projectfailures 爆料,博主那几年曾受雇于法国的一家大型科技企业,参与过一个政府机构委托的软件项目,职位是咨询顾问。在那里,他亲眼见证了登峰造极的愚蠢和疯狂,以及它们在软件开发工作中起到的可怕作用。

    十年过去了,这个地狱般的项目又被人翻了出来,再次炒的沸沸扬扬,而 projectfailures 博客甚至还就此专门出了一篇回顾。

    在文章中,他这样写到:“这已经不仅仅是什么缺乏专业能力的问题了,这个项目中对人类尊严的无情践踏,已经严重到有的时候让我感觉置身于监狱之中。”

    啥啥啥?不过是写点代码而已,除了赔上头发,难道会连命都搭进去吗!?这个项目咋这么恐怖啊!

    image

    这项目到底啥情况?

    大约是 1996 年,法国的一个政府机构请某个公司开发一款软件。总的来说这玩意应该不太复杂,只不过有一些不太寻常的小问题需要解决罢了。

    甲方预付了几百万欧元,计划工期大概2~3年左右。于是公司招了几个程序员,开始干活。随着资金陆续到位,这公司开始疯狂招人,每隔三个月左右就把队伍扩大一倍。

    结果,7年过去了,这个项目根本还不成型。因为延误造成的罚金每天都达几千欧元。于是管理层决定,要精简一下团队,减少项目开支 —— 具体做法是,把干活的人都开了,另外招一些对软件开发没啥经验的新手来上班。

    项目开始10年后,整个项目已经深陷在灾难的泥潭中,完全是由纯粹的混乱所组成。于是项目的中层管理者终于决定要招一些具有软件工程开发经验的人,来把这个烂摊子从地狱里拖出来。

    又过了两年,这项目居然还在苟延残喘。这公司通过给甲方发送金额不断提高的“设计变更”账单,来弥补每天产生的工期延误罚金。这都 2008 年了喂!

    这项目怎么能烂成这样?

    01)代码质量惨不忍睹

    在语言选择方面,没人敢说 C++ 是种简明易懂的语言。事实上,在简洁方面,C++可能算是最糟糕的一种编程语言了吧。要知道,它可是复杂到连它的创造者 Bjarne Stroustrup 本人都不敢说自己完全掌握了这门语言。

    当然,这不能全怪开发团队。要知道,在当时,像 C++ 这样拥有无尽复杂度的思维迷宫还是大有市场的。许多希望成为超级程序员的年轻人都对这门听起来超牛逼的语言趋之若鹜。而事实上,这些可怜的娃们,最后大部分都被 C++ 虐惨了,多少美好的青春,都耗费在反复调试一大段晦涩难懂的代码,耗费在探寻为啥这程序会毫无理由莫名崩溃这样的事情上了。

    而脑子正常的人,则纷纷转向了其他语言和其他项目上去了。要知道,人生苦短啊!

    不过,看起来,这家公司并没有跳出这个圈子,还是一个猛子扎进了 C++ 坑里。

    退一步说,不管你用的是什么编程语言,维护一个巨大的代码库本身就不是一件容易的事情——而这个项目的代码库居然有 600 多万行之巨。

    那,600 多万行代码是个什么概念?

    对比下 Linux 3.13 版内核的代码,在除去内核驱动和架构之外,在 kernel/ 里的源代码也不过就 13 万行左右;另一个例子是著名的编辑器 Emacs,它因为功能太多太庞大,常被人吐槽成“缺乏一个好编辑器的操作系统”,但即使如此,它的总源码规模也不过就是 165 万 9 千多行。

    就算你特别厉害,一目十行,你大概也要在显示器前面不眠不休花上7天,才能把全部 600 万行代码全部过一遍。

    于是我们可以想见,维护这么大一个代码库,可得逼疯多少程序员呢。看看下面这两个例子,我想,如果我是程序员的话,我也会先疯为敬吧。

    有一次,项目里的一个程序员被要求修复一个“右键点击界面会导致整个应用卡死”的 bug,经过连续几天的仔细检查,消耗无数耐心之后,他发现,这个右键响应事件其实工作的很正常,只不过这个“正常”过程需要程序花上 45 分钟,从某种巨大的(静态!)内容库中动态生成每一个菜单项,然后才能把菜单给显示出来。如果这时候你不幸又点了一下右键,不好意思,咱再花 45 分钟重新生成一下菜单项吧…

    还有一次,用户报了个“从 CD-ROM 载入数据失败”的 bug 。程序员们花了好几个星期来测试分析代码,最后却直接把这个 issue 标成了“已解决”。因为他们发现,从 CD-ROM 载入数据的功能其实是好的,问题在于,读取 700MB 的数据,这程序要花上大概 7 天时间罢了。

    还真是特别考验耐心呀。

    02)版本控制全都是乱来

    令人难以置信的是,这团队在完全没有版本控制工具的情况下也搞了好几年,直到团队里一个脑子还算清醒的家伙突然想到该用个版本控制工具来管理代码。刚开始的尝试结果并没有让所有人满意,所以这个团队就换到了另外一个版本控制系统。就这么将就了一两年,然后这个版本控制系统不知怎么又抽了个风,把之前所有改动的记录都丢失了。

    image

    最后这个项目选定的版本控制工具,是一团带有图形用户界面的祸害,一坨从瑞典直接进口的数字化电子垃圾。他们不得不安排了4个人组成一个“版本控制团队”,全职负责维护这个版本控制系统的正常运行。而这直接导致下列情况的出现:

    • 首次从版本控制系统中检出文件需要向版本控制团队预约,一般来说在一周后才能获得授权。

    • 想修改文件必须经过中层管理人员审批。你需要提前列出需要修改的文件,把列表告诉你的经理,然后打报告给版本控制团队申请,后者大概两天左右会给你反馈。

    • 每次对文件的修改都会触发分支,这就意味着你得自己去合并这个文件收到的所有修改。也许你会觉得,项目里这么多文件,两个人改到同一个文件里的几率应该不大,然而实际上,绝大多数改动都集中在同样的大概100来个文件里,所以每次 merge 都保证让你痛不欲生。

    • 在提交修改(检入文件)之前,你还将经受一次精神折磨:你准备提交的代码将被交给一个所谓的自动 bug 探测程序进行审阅,通过之后还要拿给中层管理人员看过,才能成功提交。不用说,这根本无济于事,bug 还是如雨后春笋一样不停冒尖,比大家除 bug 的速度块多了。更有甚者,对发现的 bug 数量进行分析后发现,这种“缺陷修正”方式带来的新 bug 数量是它所修复的 bug 数量的两倍…

    • 版本管理过于简单。旧的版本是 1,今天的版本是 2,之后的版本是 3。没有人能确切地知道具体发给客户的是哪个版本。

    某些时候,管理层会定下一个所谓的官方交付时间,而这个时间安排跟团队中的任何一种工作计划都毫无关系。当预定的交付日期到来的时候,客户实际上收到的是一张带有安装教程的……空白CD,因为已经有好几个星期没有人能构建可执行程序了。于是,客户发现自己收到的是空白光盘,然后正式投诉,然后收到一个旧版的程序光盘作为应付。而客户之所以会发现程序是旧版的,是因为软件的“关于”页上还写着跟去年那个版本一模一样的日期…

    03)团队组成更是莫名其妙

    团队里充斥着这么一大群毫无任何软件工程经验的人,这软件里要是 bug 不多就还真没天理了吧?

    还记得上面提到过,管理层曾经决定,要精简一下团队的事吧。

    按理说,任何一个脑筋正常的经理都会发现,对于这样一个纯软件工程的项目来说,人员开支必定是最主要的开支。然而,这个发现,并不能阻止管理层把所有稍微有点经验的程序员都开了,换上对工资要求低得多的菜鸟。相对的,所有的经理们的饭碗倒是都捧得牢牢的,一点都没受影响。

    看来《21天自学C++》这样的书一定被他们奉为经典了吧。

    不,你太天真了,还有《3 天学会C++》呢。

    这团队后来变成什么样了呢?55 个人里面,只有 20 个程序员,剩下 35 个都是经理。对,你没有看错,这个阵容真是豪华,给每个程序员配备了 1.75 个经理!

    没几个经理有软件工程方面的经验。那时候,刚好出了 SCO 拿着 Unix 版权起诉 Linux 用户的事情,就算这整件事不过是虚张声势,但对许多人来说,当时这事还是挺可怕的 —— 要是突然有天你不得不为自由软件付费,那可如何是好啊。

    技术知识也相当缺乏。都 200x 年了,这群人还没几个了解互联网的,少数几个熟悉互联网的,也不过就是拿互联网看看小电影而已。要是你提到你在网上看了些啥,得到的都只会是别人的窃笑而已。

    04)行政管理模式变态的发指

    上面的荒谬情况也许会让人捧腹大笑,但如果你知道管理层的那群法国佬对员工发起狠来就像是奥斯维辛集中营里的德国鬼子,那你估计就笑不出来了吧。来看看这些官僚到病态的规定吧:

    • 禁止迟到,所有人必须在上午9点前到岗。有一天,人事经理早早就守在公司大门口,把所有9点01分及之后才到公司的人都当场开除了,程序员、经理和销售,都不能幸免。

    • 咖啡机时不时就断供,一断就是好几天。理由当然是跑去喝咖啡的人效率不如坐着干活敲代码的人。不仅如此,每当有领导来开发部视察的时候,这台咖啡机还会被人关掉,免得让领导看到有人“没在干活”。

    • 厕所的脏乱差程度可以说是业内绝无仅有的恶心与恐怖。想来这也是管理层避免大家花时间蹲带薪厕的“高效”政策使然吧。

    你可能要问了,这种变态公司,怎么还有人前仆后继的来上班?最主要的是,那段时间法国国内经济正在崩溃的边缘挣扎(直到现在,法国还没完全走出这个泥潭),能找到一份足以糊口的工作就已实属不易,工作条件苛刻点也就算了。

    不可避免的结局

    正如网友评论的那样,着整个项目陷入了死循环的链条之中:缺乏经验导致低效,低效导致开销太大,节省开销又裁掉有经验的人,进一步降低效率。

    那么,为什么管理层还坐视这种情况的不断恶化呢?归根结底还是对失败的担心。如果你砍掉这个项目,就意味着这个项目失败了,而负有领导责任的人就是你。如果这项目还在苟延残喘,那等你升迁调任之后,这个烂摊子自然由继任者来收拾啦。

    最终,负责这个项目的公司领导因为挪用资金等原因被捕,进了监狱,这个在地狱的烈焰中挣扎了十几年的项目,才终于宣告终止。

    作为整件事情的亲历者,projectfailures 的博主给刚踏入编程世界的年轻人的建议是:

    ● 珍爱生命,没事别用 C++ 折腾自己;

    ● 宁愿接一些不那么稳定,但能自由发挥所长的小项目,也别贪图安逸去参加什么看起来很冠冕堂皇的工程;

    ● 面向对象的数据库并不是什么好东西;

    ● CORBA 应该在烈焰中痛苦的死去;

    ● 那些愚蠢的产品经理,请参照上一条。

    最后,如果你觉得你现在的工作很糟心很窝火,希望这个项目能让你开心一点。

    最后

    如果你看到了这里,觉得文章写得不错就点个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

    希望读到这的您能转发分享关注一下我,以后还会更新技术干货,谢谢您的支持!

    最后针对Android开发的同行,小编这边给大家整理了一些资料,其中分享内容包括但不限于 【高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术】 希望能帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也是可以分享给身边好友一起学习的!

    转发+点赞+关注,关注微信公众号【Android开发之家】获取小编为大家收录的进阶资料和面试题库

    Android架构师之路很漫长,一起共勉吧!


    转发+点赞+关注,关注微信公众号【Android开发之家】获取小编为大家收录的进阶资料和面试题库

    Android架构师之路很漫长,一起共勉吧!

    展开全文
  • 点击上方蓝字设为星标下面开始今天的学习~今天分享四个代码量很少,但很牛逼很经典的算法或项目案例。1、no code 项目地址:https://github.com/kelseyhight...
  • 作品就叫OMNISCENT 这个程序是97年Mekka ’97 4K Intro比赛的一等奖作品,汇编语言所写。整个程序全长4095字节, 生成.com程序只有4K,可是却实现了3D动画的效果,还有一段背景音乐,画面是游戏天旋地转的一个场景
  • Git:改变世界的一次代码提交

    千次阅读 多人点赞 2020-09-24 10:43:47
    摘要:如果选Linux社区历史上最伟大的一次 Git 代码提交,那一定是 Git 工具项目本身的第一次代码提交。 吾诗已成。无论大神的震怒,还是山崩地裂,都不能把它化为无形! —— 奥维德《变形记》 背景 Linux 作为...
  • 来源 | 《人人都懂区块链》责编 |晋兆雨封图 | CSDN 付费下载自视觉中国* 文末有赠书福利如果代码不可篡改,就必须保证代码没有漏洞,这就是区块链纠结的地方。区块链世界的“代码...
  • 上最烂的代码

    千次阅读 2013-09-01 22:54:00
    事实,系统复杂了被骂代码烂是一件司空见惯的事情。当然,也有一些短小的代码片段,就足以看出代码作者是个不怎么样的人。 布尔类型的使用是很容易变成代码的: 1 2 3 if (isTrue()) ...
  • C中最复杂难懂的一行代码

    千次阅读 多人点赞 2018-05-25 20:27:06
    今天在网上看到了1987年国际C语言混乱代码大赛获奖的一行代码代码只有一行,却穷尽了C中的精华。下面对这一行代码进行分析: main() { printf(&amp;amp;unix[&quot;\021%six\012\0&quot;],(unix)[&...
  • 点击运行一下 放心不会弄坏你的机子 很好玩儿的
  • 如果您只是想了解特定图形的来源,进行了哪些转换以及进行了哪些假设,那么简单的方法就是浏览Github代码。 为了帮助浏览仓库,请参阅下面的“目录”。 如果您希望能够重建部分或全部图形,请参阅“安装”。...
  • 手动添加太费时费力,在网上并没有找到合适的比较好的工具,就自己动手写了一个垃圾代码添加工具,命名为ChaosTool。 ChaosTool特点 - 自动定义变量/函数/属性 - 自动实现函数体 - 自动识别插入位置 - ...
  • 2017年12月30日,欧建新的遗体告别仪式在深圳沙湾殡仪馆举行,他的妻子带着两个孩子向他做了最后的告别,随后艰难地在火化同意书签下了自己的名字。20天前,这位研发工程师从他就职的中兴公司通讯研发大楼26层跳下...
  • 关于烂代码的那些事(

    千次阅读 2016-01-11 12:52:27
    1.摘要 最近写了不少代码,review了不少代码,也做了不少重构,总之是对...刚入程序员这行的时候经常听到一个观点:你要把精力放在ABCD(需求文档/功能设计/架构设计/理解原理),写代码只是把想法翻译成编程语言
  • 手机可以编程看代码的软件

    千次阅读 多人点赞 2020-08-11 14:41:43
    适合在路上、睡觉前,手机看代码 推荐阅读: 程序员养家活口接私活必备网站(顺便用技术改变世界) 史上最牛逼的导航网站(很全很详细) 关于苹果开发者账号续费的总结 Flash不同版本的下载安装及必要的系统组件未...
  • 我见过的糟糕代码

    万次阅读 多人点赞 2021-04-16 13:43:21
    在本文中,我将向你展示我见过的一些糟糕的代码,它们被称为“魔鬼代码”,会带来很严重的后果。然而,我们发现通过一些好的实践,你可以很容易规避它们。 “魔鬼代码” 需要改进的代码与所谓的“魔鬼代码”是...
  • 我们的身体构造是严格按照DNA来组织的。...实际我们世界是由一些基本的物质组成的,就像计算机中原始的二进制编码,然后往是汇编语言,高级程序语言,然后组成过程、函数,函数再形成一个个对象。这就好
  • 这几天,红警1的开源代码重现江湖,这个20年前,甚至25年前的代码,被我们所有的后来者所惊叹,这才是一个艺术品一般的存在。那么如果我们也想写出如此优美的代码,应该注意的事项有哪些?本文将讲述3个编码时需要...
  • 开源代码网站

    万次阅读 2018-01-17 09:29:04
    (1)到sourceforge查找相关代码; (2)到google code上面查找具体的代码; (3)到apache网站寻找java的相关代码; (4)直接到开源项目网站上面寻找代码; (5)到csdn等网站下载代码,偶尔会有...
  • 60行C代码实现一个shell

    万次阅读 多人点赞 2019-09-15 00:16:19
    继300来行代码带你实现一个能跑的最小Linux文件系统之后,我们来看看如何60行C代码实现一个shell!在实现它之前,先看看这样做的意义。美是有目共睹的。Unix...
  • 将自己写的Python代码打包放到PyPI

    千次阅读 2016-07-06 16:50:33
    刚开始我以为要将代码打包放到PyPI是一件非常复杂繁琐的事情,不过看过《Dive Into Python 3》的PACKAGING PYTHON LIBRARIES介绍(CHAPTER 16),并自己动手操作了一下,发现打包发布这个事情并没有想
  • 代码,想说爱你不容易

    千次阅读 多人点赞 2021-02-15 17:58:41
    本文内容低代码发展现状国外趋势国内风云低代码产品形态低代码研发痛点多人协作不便孱弱的表达能力混乱的变量和参数动态计算/事件顺序/黑盒子本文小结 一直想写篇文章,聊一聊“低代码”这个话题。一方面,“低代码...
  • 而有一些是必须要修改,如在实体中修改属性,一定要到数据库中修改,到dao,service,action,page一一进行修改,如果修改的是外键属性,修改的代码更为复杂。开发人员痛苦的事情就无穷无尽的修改,领导简单的一句话...
  • 无码系列-7-代码的语文修养_

    千次阅读 2019-10-23 15:17:22
    面向业务特性的代码架构,能够把业务开发和代码架构开发分离开,实现架构和业务解耦。笔者并不强调“架构与业务解耦”要比“架构与业务融合”更先进。实际对于大部分软件来说,尤其是小型的软件,架构和业务“融合...
  • 世界上最难的5种编程语言

    万次阅读 多人点赞 2020-10-14 22:27:48
    当我们谈论 c,c++ ,Java,Python的时候,有些语言不仅很难,而且对于大多数软件开发者来说几乎...Malbolge 是 Ben Olmstead 在1998年发明的,这种 esolang 被认为是最复杂的编程语言。 据说,Malbolge 编程语言的作者
  • 代码的艺术

    千次阅读 2018-03-16 10:55:09
    代码的艺术 百度技术学院-代码的艺术_章淼 课程导入 希望能够让大家对Software Engineer(软件工程师) 有更新的认识; 建立正确的意识; 明确修炼的方向。 写代码,学校和公司有很大的不同 学校:作业...
  • 你写过的最长的一行代码有多长吗?你为什么要写这么长?是看着帅呢,还是想减少代码行数? List<OperationPurchaseInfo> purchaseInfoList = sheet.getPurchaseInfoList().stream().filter(purchaseInfo -&...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 245,511
精华内容 98,204
关键字:

世界上最复杂的代码