代码整洁之道 – 程序员的职业素养(片段摘抄)

代码整洁之道 – 程序员的职业素养

最好的软件开发人员都知道一个秘密: 美的东西比丑的东西创造起来更廉价, 也更快捷. 构建、维护一个美的系统所花费的时间、金钱都要少于丑的系统.
美的系统是灵活、易于理解的, 构建、维护它们就是一种快乐.

优秀的程序员都因为爱好, 孜孜不倦的写了好多根本没可能去实际执行, 为人类创造价值的程序.

专业主义

“专业主义” 有很深的含义, 它不但象征着荣誉与骄傲, 而且明确意味着责任与义务. 这两者密切相关, 因为从你无法负责的事情上不可能获得荣誉与骄傲.

专业主义的精髓就在于将公司利益视同个人利益. 专业主义就意味着担当责任.

开发的软件有 bug 会损害软件的功能. 因此, 要做得专业, 就不能就下 bug.
当然, 软件开发太复杂了, 怎么可能会没 bug 呢? 的确, 但最重要的是, 要对自己的不完美负责. 代码中难免会出现 bug, 但这并不意味着你不用对它们负责; 没人能写出完美的软件, 但这并不表示你不用对不完美负责.

所谓专业人士, 就是能对自己犯下的错误负责的人, 哪怕那些错误实际上在所难免. 职业经验多了之后, 失误率应该快速减少, 甚至渐进于零. 失误率永远不可能等于零, 但你有责任让它无限接近零.

成熟的专业开发人员知道, 聪明人不会为了发布新功能而破坏结构. 结构良好的代码灵活. 以牺牲结构为代价, 得不偿失, 将来必追悔莫及.

如果你希望自己的软件灵活可变, 那就应该时常修改它

你应该每周工作60小时. 前40小时是给雇主的, 后20小时是给自己的. 在这剩余的20小时里, 你应该看书、练习、学习, 或者做其他能提升职业能力的事情.

业精于勤. 真正的专业人士往往勤学苦干, 以求得自身技能的纯熟精炼. 只完成日常工作是不足以称为练习的, 那只能算是种执行性质的操作, 而不是练习. 练习, 指的是在日常工作之余专门练习技能, 以期自我提升.

学习的第二个最佳方法是与他人合作. 专业软件开发人员往往会更加努力地尝试与他人一起编程、一起练习、一起设计、一起计划, 这样他们可以从彼此身上学到很多东西, 而且能在更短的时间内更高质量地完成更多工作.

让新人融入团队的最好办法是和他们坐到一起, 向他们传授工作要诀. 专业人士会视辅导新人为己任, 他们不会放任未经辅导的新手肆意妄为.

每位专业软件人员都有义务了解自己开发的解决方案对应的领域. 开始一个新领域的项目时, 应当读一两本该邻域相关的书, 要就该领域的基础架构与基本知识做客户和用户访谈, 还应当花时间和业内专家交流, 了解他们的原则与价值观念.

雇主的问题就是你的问题. 你必须弄明白这些问题, 并寻求最佳的解决方案. 每次开发系统, 都应站在雇主的角度来思考, 确保开发的功能能真正能满足雇主的需要.

专业人士知道自己自负, 不会故作谦逊. 他们熟知自己的工作, 并引以为荣; 他们对自己的能力充满自信, 并因此用于承担由吧务的风险. 专业人士不是胆小鬼.

需要尽可能做到的事情

  • 让 QA 找不出任何问题
  • 要确信代码正常运行
  • 自动化 QA
  • 不会为了发布新功能破坏结构
  • 每次读代码, 都别忘了进行点滴的改善

说”不”

专业人士敢于说明真相而不屈从于权势。专业人士有勇气对他们的经理说“不”。

你怎么能对自己的老板说”不“呢?毕竟,他们可是你的老板啊!难道不该照你老板说的去做吗?

不应该照做。只要你是一名专业人士,那就不应该照做。

奴隶没有权利说”不“。劳工或许也对说”不“有所顾忌。但是专业人士应该懂得说”不“。事实上,优秀的经理人对于敢于说”不“的人,总是求贤若渴。因为只有敢于说”不“,才能真正做成一些事情。

你的经理要求你在明天之前完成登录页面,这就是他在追求和捍卫的一个目标,那就是尽他的工作职责。如果你明知第二天之前不可能完成登录页面,嘴上却说”好的,我会试试的“,那么便是你失职了。这时候,尽职的唯一选择是说”不,这不可能“。

最要说”不“的是那些高风险的关键时刻。越是关键时刻,”不“字就越具价值。

这一点应该不证自明。当公司存亡成败皆系于此时,你必须尽己所能,把最好的信息传递给你的经理。这往往意味着要说”不“。

我们都听说过具备”团队精神“是多么重要。具备团队精神,意味着恪尽职守,意味着当其他队员遭遇困境时你要出手相助。有团队精神的人会频繁与大家交流,会关心队友,会竭力做到尽职尽责。

专业人士常常会成为英雄人物,但这样的荣誉并非是他们所刻意追求的。他们之所以成为英雄人物,是因为他们出色地完成了任务,不但按时,而且符合预算。

说”是“

做出承诺,包含三个步骤。

  • 口头上说自己将会去做
  • 心里认真对待做出的承诺
  • 真正付诸行动

但是,我们是不是常常碰到这种情况,其他人(当然不会是我们自己!)在作出承诺时,其实并没有包含这三个步骤?

很少有人会认真对待自己说的话,并且说到做到。有些人在说话时是认真的,但他从来不会说到做到。而更多的人在做出承诺后,几乎从不会认真去履行诺言。

你只能承诺自己能完全掌握的事。比如,如果你的目标是完成一个还依赖与另一团队的模块,那么你无法承诺自己能够完成这个模块,还能实现该模块与其他团队所负责模块的无缝集成。但你能承诺自己会采取一些具体的行动来达到最终目标。

即使目标无法完成,你仍能全力前进,离目标更近些。而弄清楚目标能否达成这件事,便是你可以采取的努力行动之一。

这样的事情时有发生。有些事情先前你可能没预料到,这很现实。但是如果你仍然希望自己能够不负众望,那就赶紧去调整别人对你的预期,越快越好!

如果你无法兑现承诺,那么最重要的就是尽早向你的承诺对象发出预警,越快越好,越早越好。

你越早向各利益相关方发出预警信号,整个团队就越有可能抓住机会,中止并重新评估当前的活动,并决定是否采取些措施或做出些改变(比如调整优先级等)。这么一来,你仍有可能达成之前的承诺,或者,用另一个承诺来代替先前的承诺。

在此,有一点相当重要:如果你不尽早告诉他人可能的问题,就错失了让他们帮助你达成目标、兑现承诺的机会。

今天的程序员肯定得去面对诸如估算、确定最后期限以及面对面交流等沟通活动。做出承诺或许听来令人有些害怕,但他能帮助程序员解决在沟通中可能发生的不少问题。如果你能够一直信守承诺,大家会以为你“是一名严谨的开发人员”。在我们这行中,这也是最有价值的评价。

如果进度比预期的要慢一些,你可能会冒险放弃原则。如果不写测试,你或许可以更快完成任务。如果不做重构,不运行整套回归测试,或许也可以更快完成任务。

此时,如果是专业开发人员,就不会放弃底线。首先,这种假设本身就是错误的。即使不写测试,不做重构,省掉完整的回归测试,你也无法更快完成 任务。多年经验告诉我们,打破这些纪律和原则,必然会拖慢进度。

其次,身为专业开发人员,你有责任根据标准规范自身工作。代码必须经过测试,代码必须要有对应的测试代码。要确保代码清晰整洁,而且必须确保没有影响到系统的其他部分。

作为专业开发人员,你已经承诺会遵守和捍卫这些标准。你做出的其他所有承诺,都应该和这份承诺保持一致。

专业人士不需要对所有请求都回答“是”。不过,他们应该努力寻找创新的方法,尽可能做到有求必应。当专业人士给出肯定回答时,他们会使用正式的承诺,以确保各方面明白无误的理解承诺的内容。

编码

能够感知到错误非常重要。说明你已经能够非常迅速的获得反馈,能够更为快速地从错误中学习。要熟练掌握每项技艺,关键是要具备“信心”和“出错感知“能力。

编码是一项颇具挑战也十分累人的智力活动。相比其他类型的活动,编码更加要求聚精会神。因为在编码时你必须平衡互相牵制的多种因素:

  • 首先,代码必须能够正常工作
  • 代码必须能够帮你解决客户提出的问题
  • 代码必须要能和现有系统结合的天衣无缝
  • 其他程序员必须能读懂你的代码

而且,编码时无可避免地会受到各种干扰。当你无法全神贯注地编码时,所写代码就有可能出错。

如果感到疲劳或者心烦意乱,千万不要编码。强而为之,最终只能回头返工。相反,要找到一种方法来消除干扰,让心绪平静下来。

软件开发是一场马拉松,而不是短跑冲刺。你无法全程一直以最快的速度赢得比赛,只有通过保持体力和维持稳定节奏来取胜。无论是赛前或者赛中,马拉松选手都会调整好自己的状态。专业程序员也会同样仔细地保存好自己的精力和创造力。

流态区

关于高效率状态,大家已经写了很多,这种状态通常称为”流态“。在这种状态下,程序员会感到效率极高;在这种状态下,会感到“绝无错误”。因此他们 一直苦苦追求进入这种状态,并经常以能在那种状态下维持多久来衡量自我价值。

一些曾经进入这种状态但最终摆脱出来的人给出了一点忠告:“避免进入流态区”。这种意识状态并非真的高效,也绝非毫无错误。这其实是一种”浅层冥想“状态,在这种状态中,为了追求所谓的速度,理性思考的能力会下降。

在流态区,你可能能够敲出更多的代码。你会收获一种愉悦感或者征服感。问题在于,在流态区状态下,你其实放弃了顾及全局,因此,你可能会做一些后来不得不推倒重来的决策。在流态区写代码可能会快些,但是后面你将不得不更多地回头审视这些代码。

帮助

编程并非易事。越年轻的程序员对此可能越没有什么感觉。但是随着经验增长,必须小心谨慎地将系统分解为易于理解的小单元,同时使这些单元直接的关系越少越好,这并非易事。

编程很难,事实上,仅凭一己之力无法写出优秀的代码。即使你的技能格外高超,也肯定能从另外一名程序员的思考与想法中中获益。

因此,互相帮助也是每个程序员的职责所在。将自己封闭在格子间或者办公室里与世隔绝,有悖于专业的职业精神。你的工作不可能重要到你不能花一丁点时间来帮助别人。事实上,作为专业人士,要以随时能够帮助别人为荣。

沟通

专业开发人员既要做好开发,也要做好沟通。“输入糟糕,输出也会糟糕”对程序与同样通用,所以职业程序员会重视与团队及业务部门的沟通,确保这种沟通的准确、流畅。

开发方与业务方之间最常见的沟通是关于需求的。业务方描述他们认为自己需要的东西,程序员按照自己理解的业务方表达的需求来开发。至少从理论上来说,应该是这样。但在现实里,关于需求的沟通是及其困难的,其中会表现出各种问题。

做业务的人和写程序的人都容易陷入一个陷阱,即过早进行精细化。业务方还没有启动项目,就要精确知道最后能得到什么;开发方还没有评估整个项目,就希望精确知道要交付什么。双方都贪求不现实的精确性,而且经常愿意花大价钱来追求这种精确。

在工作中,有一种现象叫做观察者效应,或者不确定原则。每次你向业务方展示一项功能,他们就获得了比之前更多的信息,这些新信息反过来又会影响他们对整个程序的看法。

最终结果就是,需求完成的越精细,就越容易被忽视,系统因此也谈不上完工。

首先,即使拥有全面准确的信息,评估也通常会存在巨大的变数。其次,因为不确定原则的存在,不可能通过反复推敲实现早起的精确性。需求是一定会变化的,所以追求那种精确性是徒劳的。

避免过早精细化的方法是尽可能的推迟精细化。专业人员直到到手的开发的前一刻才会把需求具体化。但是,这可能造成另一个问题:迟来的模糊性。

业务方常常会提出不同意见。这时候他们会发现,相比去解决分歧,更好的办法是换一种说法,所以会寻找各方都同意的关于需求的表述,而不是去解决争端。

需求文档的每一点模糊之处,都对应着业务方的一点分歧。当然,模糊不只来自于分歧或争论。有时候,业务方会想当然地认为看文档的人懂得自己的意思。

验收的目的是沟通、澄清、精确化。开发方、业务方、测试方对验收测试达成共识,大家都能够明白系统的行为将会是怎样。各方都应当记录这种准确的共识。在专业开发人员看来,与业务方、测试方协同工作,确保大家都明白要做什么,是自己的责任。

验收测试都应当自动进行。在软件开发的周期中,确实有时候需要手动测试,但是验收测试不应当手工进行,原因很简单:要考虑成本。

专业人员会避免手动测试。相比手动测试,自动化测试的成本非常低,让人手工执行测试脚本不划算。专业开发人员认为,实现验收测试的自动化是自己的责任。

请务必确保在持续集成系统中,单元测试和验收测试每天都能运行好几次。整套持续集成系统应该由源代码管理系统来触发。只要有人提交了代码,持续集成系统就会开始构建,并运行所有的测试,测试结果会用电子邮件发给团队的所有人。

保持持续集成系统的时刻运行是非常重要的。持续集成不应该失败,如果失败了,团队里的所有人都应该停下手里的活,看看如何让测试通过。在持续集成系统里,失败的集成应该视为紧急情况,也就是“立刻终止”型事件。

测试

尽管公司可能设有独立的 QA 小组专门测试软件,但是开发小组仍然要把“QA 应该找不到任何错误”作为努力的目标。

当然,这个目标定得有点高。毕竟,如果有一群聪明人联合起来绞尽脑汁找出产品中所有的瑕疵和不足,他们肯定是能够找出一些问题的。对 QA 找到的每一个问题,开发团队都应该高度重视、认真对待。应该反思为什么会出现这种错误,并采取措施避免今后重犯。

会议

会议的成本非常高。如果你去算算会议的成本,你会很吃惊。

关于会议,有两条真理:

  • 会议是必须的
  • 会议浪费了大量时间

受到邀请的会议没有必要全部参加。参加的会议太多,其实只能证明你不够专业。你应该理智的使用时间,所以必须谨慎选择,应当参加哪些会议,礼貌拒绝哪些会议。

邀请你参加会议的人并不负责管理你的时间,为时间负责的只有你。所以,如果你收到会议邀请,务必确保出席会议可以给自己目前的工作带来切实且显著的成效,否则不必参与。

还有些时候,有职权的人(比如其他项目的高级工程师或者主管)命令你必须参加某些会议。这时候应当问问自己,他们的职权是否比自己的工作计划更重要。同样,自己团队的同事和领导也可以帮忙决策。

领导的最重要责任之一,就是帮你从某些会议脱身。好的领导一定会主动维护你拒绝出席的决定,因为他和你一样关心你的时间。

如果会议让人厌烦,就离席。仔细管理自己的时间是你的责任。如果你发现参加某个会议是在浪费时间,就应当想个礼貌的办法退出来。

重要的是,你应当明白,继续待在会议室里是浪费时间;继续参加对你没有太多意义的会议,是不专业的行为。

优先级

专业人员评估每个任务的优先级,排除个人的喜好和需要,按照真实的紧急任务来执行任务。

专业开发人员会用心管理自己的时间和注意力。他们知道优先级错乱的诱惑,他们也珍视自己的声誉,所以会抵制优先级错乱。他们永远有多种选择,永远敞开心扉听取其他解决方案,他们从来不会执拗于某个无法放弃的解决方案。他们也时刻警惕着正在暴露的泥潭,一旦看清楚,就会避开。最糟糕的事情,莫过于看到一群开发人员在徒劳地拼力工作,结果却陷入越来越深的泥潭。

预估

预估是软件开发人员面对的最简单,也是最可怕的活动之一了,预估影响到的商业价值巨大,关乎声誉,也给我们带来了很多的苦恼和挫折。预估是业务人员和开发人员之间最主要的障碍,横亘在双方之间的种种不信任,几乎由它引发。

什么是预估

问题在于,不同的人对预估有不同的看法。业务方觉得预估就是承诺。开发方认为预估是猜测,两者相差迥异。

专业开发人员不随便承诺,除非他们确切知道可以完成。道理就是这么简单。如果你被要求承诺做自己不确定的事情,那么就应当坚决拒绝。如果要求你承诺在某天完成,但是需要每天加班,周末加班,取消休假,那么最后的决定取决于你;不过,不要违背自己的意愿去勉强。

承诺是关于确定性的。其他人会把你的承诺当真,据此拟定计划。如果不能兑现承诺,他们的损失,以及你的声誉受到的影响,都是巨大的。不能兑现的承诺也是一种欺骗,只不过比明目张胆的欺骗好一点。

预估是一种猜测。它不包含任何承诺的色彩。他们不需要做任何约定。预估错误无关声誉。我们之所以要预估,是因为不知道到底要花多少时间。

不幸的是,大多数软件开发人员都很不擅长预估。这不是因为他们没有掌握关于预估的诀窍——根本没有这样的诀窍。预估的偏差总是很大,原因在于我们并不理解预估的实质。预估不是个定数,预估的结果是一种概率分布。

专业开发人员能够区分预估和承诺。只有在确切知道可以完成的前提下,他们才会给出承诺。此外,他们也会小心避免给出暗示性的承诺。他们会尽可能地说明预估的概率分布,这样主管就可以做出合适的计划。

压力

即使有压力,专业开发人员也会冷静果断。尽管压力不断增大,他仍然会坚守所受的训练和纪律,他知道这些是他赖以战胜最后期限和承诺所带来压力的最好方法。

在压力下保持冷静是最好的方式,便是会规避导致压力的处境。规避的方式也许无法完全减除压力,但是可以大大降低压力并缩短高压力期的时间。

业务人员可能在没有事先咨询我们的情况下就向客户做出了承诺。发生这种事情,出于责任感我们必须主动帮助业务方找到方法来兑现这些承诺,但是一定不能接受这些承诺。

专业人士总会千方百计地帮助业务方找到达成目标的方法,但并不一定要接受业务方代为做出的承诺。最终,如果我们没有兑现业务方所作出的承诺,那么该由当时做出承诺的人来承担责任。

如果因为没能兑现承诺而导致业务失败了,你也将无法按时拿到薪水,这种情况下可能能感受不到压力。但是,如果此前你已经表现得十分专业,那么至少在找新工作时可以昂首挺胸问心无愧。

快速前进确保最后期限的方法,便是保持整洁。专业人士不会为了快点前进而乱来。他们明白“快而脏”是自相矛盾的说法。脏乱只会导致缓慢!

协作

大多数软件都是由团队开发出来的。当团队成员能够十分专业地互相协作时,整个团队是最为高效的。单打独斗与游离与团队之外都是不专业的表现。

专业程序员的首要职责是满足雇主的需求。这意味着你要和你的经理们、业务分析师们、测试工程师们和其他团队成员很好地协作,深刻理解业务目标。这并不是说你必须要成为业务方面的专家,而是说你需要理解手头上正在编写的代码的业务价值是什么,了解雇你的企业将如何从你的工作中获得回报。

专业程序员最糟糕的表现是两耳不闻窗外事,只顾一头将自己埋在技术堆里,甚至连公司业务火烧眉毛行将奔溃了也不闻不问。你的工作职责就是要让业务免于陷入困顿,让公司可以长久发展下去。

因此,专业程序员会花时间去理解业务。他们会和用户讨论他们正在使用的软件,会和销售人员与市场人员讨论所遭遇的问题,会和经理们沟通,明确团队的短期目标和长期目标。

简而言之,他们会将注意力放在与业务同舟共济上。

程序员与程序员

程序员直接通常很难密切合作,这就会带来一些不小的问题。

代码个体所有

不正常的团队最糟糕的症状是,每个程序员在自己的代码周边筑起一道高墙,拒绝让其他程序员接触到这些代码。我曾在需要地方看到过,不少程序员甚至不愿让其他程序员看见他们的代码。这是引发灾难的“最有效秘诀”。

协作性的代码所有权

将代码所有权的各种隔断全部打破、由整个团队共同拥有全部代码的做法,相较于此则要好得多。

团队中每位成员都能签出任何模块的代码,做出任何他们认为合适的修改。专业人士期望拥有代码的是整个团队,而非个人。

专业开发人员是不会阻止别人修改代码的。他们不会再代码上构造所有权的潘篱,而是尽可能多地互相合作。他们通过合作来达到学习的目的。

结对

“结对编程”是解决问题最有效的方法。专业人士会结对工作。

专业人士结对工作,还因为这是分享知识的最好途径。专业人士不会仅凭一己之力从零开始创建知识,而是通过互相结对来学习系统的不同部分和业务。他们明白,尽管每位团队人员都有自己的位置,但是在紧要关头,每位团队成员也要能够接替其他人的位置。

专业人士之所以结对,是因为结对是复查代码最好的方式。系统中不应该包含未经其他程序员复查过得代码。代码复查的方法很多,但大多数方法效率都极其低下。最有效率且最有效果的代码复查方法,就是以互相协作的方式完成代码编写。

团队与项目

形成团队是需要时间的。团队成员需要首先建立关系。他们需要学习如何相互协作,需要了解彼此的批号、强项、弱项,最终,才能凝聚成团队。

有凝聚力的团队确实有些神奇之处。他们能一起创造奇迹。他们互为知己,能够替对方着想,互相支持,激励对方拿出自己最好的表现。他们攻无不克。

成员克服个体差异,默契配合,彼此信任, 形成真正有凝聚力的团队,是需要一些时间的,可能需要6个月,甚至1年。但是,凝聚力一旦真正形成,就会产生一种神奇的魔力。团队的成员会一起做计划,一起解决问题,一起面对问题,一起搞定一切。

团队已经有了凝聚力,但却因为项目结束了就解散这样的团队,则是极其荒谬的。最好的做法是不拆散团队,让他们继续合作,只要不断地把新项目分派给他们就行。

专业的开发组织会把项目分配给已形成凝聚力的团队,而不会围绕着项目来组建团队。一个有凝聚力的团队能够同时承接多个项目,根据成员各自的意愿、技能和能力来分配工作,会顺利完成项目。

团队比项目更难构建。因此,组件稳健的团队,让团队在一个又一个项目中整体移动共同工作是较好的做法。并且,团队也可以同时承接多个项目。在组建团队时,要给于团队充足的时间,让他们形成凝聚力,一直共同工作,成为不断交付项目的巨大引擎。

JavaWeb 学完了,稍微休息下吧

JavaWeb在传智急先锋的老师辛勤的工作下,以及顺利学完了。虽然,只学到jsp,框架什么的都没学。不过,对简单的项目,应该已经没问题了。

虽然,说好的要休息一天的,结果怎么样也呆不住,亚历山大啊!所以就准备写一篇博客安慰一下自己了~

这篇文章我也不知道改写什么,想到什么写什么吧。

空间、朋友圈、只要有人的地方,都有现充在晒女友。这让我一个又宅又变态的半吊子程序员,该用什么表情、用什么心情,去观看、回复呢!!!

说真的,喜欢人类的Timing对我来说很简单,几乎每一个在我身边的、我能够接触到的,我都能够喜欢上。甚至对我有帮助的,从未谋面的,我也非常喜欢。

但真正让我去和一个人相处、交谈、消费时间,而且是建立在友人以上的状态,对我来说非常难。或者说,我并不会去主动去建立这样一种关系。这对我非常不利,在这个越来越需要交流的社会。所以说,我现在女性挚友一个没有,男性挚友不到一只手。虽然同学很多,但却不会主动去联系,如果能够见面,倒是感觉不错。我努力的改变自己的心境,结果导致的是单方面的,我只能去聆听,如果让我去主动的话。我会感觉到,好像没有什么是非常必要的需要沟通的东西,我并没有什么必须要说给其他人听的东西。就算说了一些我的情况,反而那些变态的言论会导致我的处境更加的不好。

所以说,心境的提升也是有副作用的。而这个副作用,会因为你自身的环境以及性格进行放大。这会导致你,变得非常怪异。所以,看到这段话的朋友,希望能够静下心来想一想。自己目前的心理状态是否正常,是否在平稳的发展,别基于求成,而导致自己与身边的环境产生巨大的沟壑。

当然,这也不是绝对的不行。当你觉得自己和周围的环境格格不入的时候,或许你该换个环境了。我现在是这么想的——培训完之后找机会去大城市,再去感受一下曾经年轻的时候没有完全感受到的大都市的意志,借助这个提升,让自己跳过目前的薄弱阶段,然后去重新开始。重新开始对世界这个美妙的东西的探究。

稍微总结一下变态的方面吧,希望有热心的朋友能够给我一点提示:

  1. 懒,懒到如果不是非常必要的话,是不会和别人说什么的。就算是最好的朋友、或者家人,我都是按照正常的交流方式,去和他们交流一些必要的语言。这也不是说我在网络上善于交流,我现在网络上也只是获取信息和学习了,对于他们的感谢之心,我只会默默的记下而已。
  2. 同样还是与人交流的问题。我会在和别人谈话到没话题的时候,心里是不会有去找点什么话题的想法的。
  3. 拒绝正常的娱乐方式:
    1. 电视剧,几乎不看,而且现在一般情况下是没有电视的,有电脑也不会主动去找什么电视剧来看。
    2. 电影,很少看,最近看的就是《星际穿越》,好像已经过了好长时间了,而且还是盗版了,没去电影院
    3. 游戏,几乎没玩,过年只配朋友玩过《lol》,然后很少玩游戏了
    4. 小说: 很少看,最近一年之内,只看了一本科幻的作品,会追着作者看,不过有时候几天都想不起来,然后想起来就看完
    5. 运动:几乎不运动,除了去上课的时候走路。因为上课时间紧张,加上除了自行车也没什么喜欢的运动了。
  4. 与二次元的联系也越来越少:以前会追B站几乎所有的新番,还有看不到的也追。最近越来越少了,而且以前准备捡起来的没看的也不想去。渐渐的,好像只有几部需要每周看的了,虽然每到该追番的时候还是很激动。但是,感觉适合我的动漫越来越少了,最近的动画也越来越固定了,越来越没有意思,没有创造。我最初喜欢动漫,就是因为它的天马行空的想象力,无所拘束的剧情,以及敢于针对不正确的问题的探索。但是,越来越丧失了。当我将自身的境界提升之后,我感觉自己对动漫的爱在这次过程中丧失了一些。或许是转移到了对于人类的Timing的喜欢上。这是对于自己的爱的误解吗?我不太清楚,我也不想去知道,我只是觉得,目前这样就好。
  5. 黄色、低俗,虽然对我来说不算什么。但是,和其他人聊天的时候,总喜欢使用一些网络词汇或者出名的梗,但是当其他人不知道的时候,我就悲剧了。我从来没有想传教或者拉人去网络,去推荐贴吧什么的。所以,当他们问我的时候,我只能说自己是个变态了。其实真的挺变态的:本子、图片、AV等等,我有时候会去看看。不过,我好像已经20+了,算是成年人了吧!我觉得体验一下这种感觉也好,单身的感觉,会让你更珍惜将要陪你一起走上死亡之路的最近的伙伴。同样,这个道理其实可以扩展到家人、朋友等等。你需要学习的不只是体位,而是判断会产生的问题以及解决方法,以及如何和自己的身体相处。
  6. 由于最近突然对人类的Timing有兴趣了。所以相对的,对男人和女人都有兴趣了。当然,有与我是男人,所以好多信息可以通过自身来得到。但是,对于女性的一些信息,我却无从得知。而目前,我对直接和女性谈话还是不知道方法,如果只问感兴趣的问题的话,会对别人不太好,我需要同等的交换信息。所以,现在走在路上,对遇到的每一个女性人类生物,我都会仔细的观察一下,分析她们目前的状态。至于为什么这样做,我觉得,女性其实渐渐的开始觉醒了。我以后也是需要和她们进行沟通的,男人和男人是比较简单的就可以沟通,但是对于跨越了半个种族的生物来说,应该是稍微困难一点的。所以我需要了解她们。(我是不是有隐藏的傲娇属性?)其实我心里对于女汉纸的评价是很高的,当然这是说那些喜欢努力,想要超越男人,想要获得不一样的东西的妹子们。妹妹和萝莉之下,就是可爱的女汉纸们了!
  7. 我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!我是变态!

最后,再说一次:我是变态。 不过希望,看到这篇文章的朋友们不要进行恶意的传播。变态(gentleman),只需要被变态(hentai)认可就足够了!

静下心来之后,往往会胡思乱想。然而,在这胡思乱想之后,却又对人生进行忏悔。为了美好的每一天,我需要变得更加的变态。或许,只有这样,我才能够拯救身边的人,顺便改变所在的一方世界。

Thank Reading! by Etby.

程序设计入门-c语言(第六周编程题)

1
多项式加法(5分)

题目内容:

一个多项式可以表达为x的各次幂与系数乘积的和,比如:

现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。

程序要处理的幂最大为100。

输入格式:

总共要输入两个多项式,每个多项式的输入格式如下:

每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。第一行一定是最高幂,最后一行一定是0次幂。

注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。

输出格式:

从最高幂开始依次降到0幂,如:

2×6+3×5+12×3-6x+20

注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。

输入样例:

6 2

5 3

3 12

1 6

0 20

6 2

5 3

2 12

1 6

0 20

输出样例:

4×6+6×5+12×3+12×2+12x+40

时间限制:500ms内存限制:32000kb
#include <stdio.h>
#include <math.h>

void outNum(int j,int k)
{
    int absk = abs(k);
    if(absk==1 && j!=1 && j!=0)
    {
        printf("x%d",j);
    }
    else if(absk==1 && j!=0)
    {
        printf("x");
    }
    else if(absk==1)
    {
        printf("%d",absk);
    }
    else if(j==0)
    {
        printf("%d",absk);
    }
    else if(j==1)
    {
        printf("%dx",absk);
    }
    else
    {
        printf("%dx%d",absk,j);
    }

}

int main()
{
    int num[101] = { (0) };
    int cut = 0;
    int ent = 0;
    int i,j,k;
    while(cut < 2)
    {
        k=0;
        scanf("%d %d",&j,&k);
        num[j] += k;
        if(j==0)
            cut++;
    }

    for(i=100;i>-1;i--)
    {
        j=i;
        k=num[j];
        if(k!=0)
        {
            ent++;
            if(cut==2)
            {
                if(k<0)
                    printf("-");
                outNum(j,k);
                cut ++;
            }
            else
            {
                if(k<0)
                {
                    printf("-");
                    outNum(j,k);
                }
                else
                {
                    printf("+");
                    outNum(j,k);
                }
            }
        }
    }
    if(ent==0)
        printf("0");

    return 0;
}
2
鞍点(5分)

题目内容:

给定一个n*n矩阵A。矩阵A的鞍点是一个位置(i,j),在该位置上的元素是第i行上的最大数,第j列上的最小数。一个矩阵A也可能没有鞍点。

你的任务是找出A的鞍点。

输入格式:

输入的第1行是一个正整数n, (1<=n<=100),然后有n行,每一行有n个整数,同一行上两个整数之间有一个或多个空格。

输出格式:

对输入的矩阵,如果找到鞍点,就输出其下标。下标为两个数字,第一个数字是行号,第二个数字是列号,均从0开始计数。

如果找不到,就输出

NO

题目所给的数据保证了不会出现多个鞍点。

输入样例:

4

1 7 4 1

4 8 3 6

1 6 1 2

0 7 8 9

输出样例:

2 1

时间限制:500ms内存限制:32000kb
#include <stdio.h>

int main()
{
    int i,j,k,n;
    int x,y;
    int nn[100][100];
    scanf("%d",&n);
    if(n!=1)
    {

        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%d",&nn[i][j]);
            }
        }
    }
    if(n==1)
    {
        printf("0 0");
        return 0;
    }
    for(i=0;i<n;i++)
    {
        x=0;y=0;
        for(j=0;j<n;j++)
        {
            if(nn[i][j] > nn[i][y])
            {
                y=j;
            }
        }
        for(j=0;j<n;j++)
        {
            if(nn[j][y]<nn[x][y])
            x=j;
        }
        if(nn[i][y]==nn[x][y])
        {
            printf("%d %d",x,y);
            return 0;
        }


    }
    printf("NO");
    return 0;
}

php 验证码学习笔记

我们为什么需要验证码?

  • 需要判断正在执行操作的另一方,是真正的人/或者是非人(机器人/脚本/程序)。

生产验证码的基本步骤?

  1. 产生效验数据
  2. 产生干扰数据
  3. 生成图片
  4. 让用户看到图片
  5. 验证真实性

PHP做验证码主要用GD库来实现。

 

GD

  • resource imagecreatetruecolor(int $width,int $height);
  • 创建一个图片 返回一个图像标示符
  • imagecolorallocate (resource $image, 255, 255, 255);
  • 分配颜色  输入资源标示符+RGB颜色  返回一个标示符
  • // 如果想要显示透明度 可以用 imagecolorallocatealpha() 函数;
  • bool imagefill ( resource $image, int $x, int $y, int $color);
  • 区域填充 在image资源上,开始坐标为x,y 填充 color
  • bool imagesetpixel ( resource $image, int x,int y, int $color);
  • 在image资源上 在x,y坐标产生一个像素的color颜色的点
  • bool imageline ( resourcce $image, int $x1, int $y1, int $x2, int $y2, int $color);
  • 在image资源上,从 x1,y1画到 x2,y2,产生一条颜色color的线段
  • bool imagestring ( resource $image, int $fontsize, int $x,int $y, string $string, int $color );
  • 在image资源上 ,从 x,y开始花上字符串string,并且颜色是color,字体大小是fontsize

其他需要掌握的函数

  •  string substr( string $string , int $start [, int $length ] );
  • 返回 字符串。 从源字符串string上,从start开始 到长度为length处截取 。
  • int rand ( int $min, int $max );
  • 返回min到max直接的随机数。

如果你还要验证的话

  • $_SESSION[]
  •  session 全局变量需要知道
  • bool session_start(void);
  • 创建新会话或者重用现有会话。
  • $_REQUEST[]
  • request 全局变量需要了解

等等 你需要了解更多,请查看 php手册 ,边学习边看手册是一个不错的方法。

最后, 是练习的代码:

<?php
session_start();
// create image
$image = imagecreatetruecolor(100, 30);
// color image
$bgcolor = imagecolorallocate($image, 255, 255, 255);
// put color
imagefill($image, 0, 0, $bgcolor);
// create pixel
for ($i=0; $i < 200; $i++) { 
	$x=rand(0,200);
	$y=rand(0,30);
	$pixcol = imagecolorallocate($image, rand(1,200), rand(1,200), rand(1,200));
	imagesetpixel($image, $x, $y, $pixcol);
}

// create  line 
for ($i=0; $i < 4; $i++) { 
	$linecolor = imagecolorallocate($image, rand(100,200), rand(100,200), rand(100,200));
	imageline($image, rand(0,50), rand(0,30), rand(0,100), rand(0,30), $linecolor);
}

// create unique rand int
for ($i=0; $i < 4; $i++) { 
	$num = rand(0,9);
	$numcolor = imagecolorallocate($image, rand(0,150), rand(0,150), rand(0,150));
	$x = ($i+1)*20;
	$y = rand(0,15);
	imagestring($image, 6, $x, $y, $num, $numcolor);
}

// create unique sting 
$yzmyz = '';
for ($i=0; $i < 4; $i++) { 
	$strcol = imagecolorallocate($image, rand(0,150), rand(0,150), rand(0,150));
	$data='abcdefghijkmnpqrstuvwxy123456789';
	$str = substr($data, rand(0,strlen($data)-1),1);
	$yzmyz .= $str;
	imagestring($image, 6, ($i+1)*20, rand(0,15), $str, $strcol);
}



$_SESSION['yzmyz'] = $yzmyz;


header('Content-type: image/png');

imagepng($image);

// drop image 
imagedestroy($image);
?>

ItPP Team

由4个刚刚成年的菜鸟程序员(爱好者)组建的 业余 团队 成立了 , 团队主页 ITPP.TOP 。

InTernet Positive People  在互联网行业快乐的挣扎,这是我们最美好的期望。

当然,我们每个人都有自己的学习和工作,处在实习阶段和在社会上努力的初 成年人 , 是我们的组成。

同样,欢迎 16岁以上能独立思考的喜爱互联网的菜鸟加入。当然,如果你是已经在职的IT成功人士,也可以加入,来一起寻找过去和未来,心中的那一种感情……

以上 by:ETby ;

再次回到linux系统——寻找曾经失去的东西,以及改变自己的力量

由于前段时间断网,就没碰电脑。然后再我不在的时候,家里人给我刷成Xp系统的了,我用了几天用不下去了,然后就换成了Win8的系统。

用了将近一个月Win8,体验了一下现代化的感觉。嘛,其实根本差不了多少。就是除了有时候和朋友玩两把英雄联盟而已。

这一年发生的事情很多,我也在急速成长。

我一直在问自己:你想要成为一个什么样的人?你要如何赚钱并且生存下去?你怎么看待这个家族?你想如何改变家庭现状?

结果,我发现:在这个世界上,我想要改变一些东西的话。以我现在的能力,还完全不够。

我也在思考,是不是应该放弃计算机?然后像其他人一样,过着普通但还算幸福的生活。 结果,我的意识给了我绝对的答案 —— “No”。

不可以,做不到。我不甘心!
不甘心放弃,在付出代价,得到很多痛苦的回忆之后;
不甘心自己的命运被父母掌控,随心所欲的任凭他们摆布;
不甘心受到的屈辱与嘲笑就此化作烟尘散去;
不甘心过着如此贫穷的生活,不敢买衣服,不敢买贵一点的午饭,不敢买自己喜欢的设备,甚至不敢去找个女朋友、结婚这种事情更是想都不敢想。

所以,我想改变世界。改变我身边的一切,然后在极度的恐惧中——离开这个世界。我怕死,非常怕。所以我需要一条走不到尽头的道路,因为我不想再死之前,感受绝望、感受无聊。无聊亦是最大的绝望,在我的思维模式中。我恐惧它,但又无力去改变,所以无需要一座独木桥。过则生,亦则死。这是我在这游戏中,在这伟大的地球Online中,唯一的一次抵抗。

对不起了,明明是一次正常的状态改变。却因为我这扭曲的思维方式,成为一篇莫名其妙的文章。原谅我,我的小伙伴们;还有Linux,你是我觉得很不错的朋友,是我的信仰之一。请助我一臂之力……

—— by:Etby

【酷壳】编程能力与编程年龄

程序员这个职业究竟可以干多少年,在中国这片神奇的土地上,很多人都说只能干到30岁,然后就需要转型,就像《程序员技术练级攻略》这篇文章很多人回复到这种玩法会玩死人的一样。我在很多面试中,问到应聘者未来的规划都能听到好些应聘都说程序员是个青春饭。因为,大多数程序员都认为,编程这个事只能干到30岁,最多35岁吧。每每我听到这样的言论,都让我感到相当的无语,大家都希望能像《21天速成C++》那样速成,好多时候超级有想和他们争论的冲动,但后来想想算了,因为你无法帮助那些只想呆在井底思维封闭而且想走捷径速成的人

今天,我们又来谈这个老话题,因为我看到一篇论文,但是也一定会有很多人都会找出各种理由来论证这篇论文的是错的,无所谓了,我把这篇文章送给那些和我一样准备为技术和编程执着和坚持的人。

论文

首先,我们先来看一篇论文《Is Programming Knowledge Related to Age?》(PDF链接),这篇论文是两个北卡罗莱纳州立大学计算机科学系的两个人Patrick Morrison 和 Emerson Murphy-Hill 对StackOverflow.com上的用户做了相关的数据挖掘得出来的一些数据。(我们知道StackOverflow.com上的数据是公开的,任何人都可以用来分析和统计,所以这篇论文的真实性是有的)

数据采样和清洗条件如下:(数据全量是1694981用户,平均年龄30.3岁)

  • 15-70岁之间的用户(这年龄段的用户被称做“Working age”),当然,有很多用户没有输入年龄,这些用户都被过滤了。
  • 用户在2012年内都回答过问题。因为StackOverflow在2012年对问题和答案的质量要求得比以前高了一倍,所以更能反映程序员的真实水平。
  • Reputation声望在2-100K之间。(注:StackOverflow的用户Reputation是得到社会认可的,在面试和招聘中是硬通货币。比大学的学分更有价值)

上述的条件一共过滤出84,248名程序员,平均年龄:29.02岁,平均Reputaion在1073.9分。

年龄分布图

下面我们来看一下他们的年龄分布图:我们可以看到程序员年纪的正态分布(高点在25岁左右,但是中点在29岁左右)

能力和年龄分布图

然后,计算每个人每个月的Reputation,这样可以找到这个用户的真正的活跃时间,这样便于计算这个程序员的真实能力。(总声望 / 活跃时间),可以得到他平均每个月得来的Reputation。

我们来看看程序员的能力和年龄段的分布图:(你可能会大吃一惊)

上图中我们可以看到,程序员的能力在从25岁左右开始上升,一直到50岁后才会开始下降。所以说,程序员吃的不是青春饭。只有码农,靠蛮力,用体力而不是用脑力的程序员才是吃青春饭的人。

年纪大的人是否跟不上新技术

论文的作者分析了Tag,用了最近5年内比较流行的技术Tag,然后用了一套比较严谨的算法来查看那些所谓的“老程序员”是否在新技术上跟上不了,所谓跟不上,也就是这些老的程序员在回答这些新技术上并不活跃。所谓老,就是37岁以上的程序员(就是我现在的年纪)。

得到了下表:可以看到,老程序员和年轻的程序员对于一些新技术的学习来说也是差不多的,甚至有些项还超过了年轻的程序员。

结论

论文的结论是:

1)程序员技术能力上升是可以到50岁或60岁的。

2)老程序员在获取新技术上的能力并不比年轻的程序员差。

我的一些感受

最后,我说一说我的一些感受:

  • 这些年来的对于外企和国内感受—— 国外牛B的IT公司的工程能力并不见得比国内的要强多少,但是国外那些NB的IT公司的架构和设计能力远远超过国内的公司,最可怕的是,那些有超强架构和设计能力的“老程序员们”还战斗在一线,这些战斗在一线的老鸟的能力绝对超过100个普能的新手。
  • 对年轻程序员的感受——国内新一代的程序员们太浮燥了。老实说,对于大多数人来说,如果你没有编程到30岁,你还不能成为一个“合格”的程序员所以,并不是编程编到30岁就玩完了,而是编程编到30岁才刚刚入门。这些不合格的程序,整天BS这个不好,那个不好的,而且喜欢速成,好大喜功。
  • 我是一个奔四的人了,编程就像登山一样,越往上爬人越少,所以,在我这个年纪还有想法,对编程还有热情的人不多了,基本上都是转Manager了。其实,什么职位,Title都是虚的,公司没了什么都没了,只有技术才是硬通货。而且,越是这个年纪还在玩编程玩技术的人,其实其经验和能力都是比较强的,都是中坚力量,如果还有其它这个年纪和我一样的人,求交往

(全文完)

[预告片]Hello World—IT男的逆袭

中国第一部程序员题材的微电影《Hello World—IT男的逆袭》预告片重磅推出!

该片系由中国本土最大的开源技术社区——开源中国策划,看那些梦想着女神、财富、出人头地的IT屌丝男们如何逆袭!

作为对阿里云及全体程序员的献礼,全片将于10月25日阿里云开发者大会上首映,敬请期待!


嘛,开源中国是我见过最有特色最喜欢的It类网站了。加油,成为不断前进的程序员。