【导语】“bsk899”通过精心收集,向本站投稿了5篇我所信奉的编程哲学,小编在这里给大家带来我所信奉的编程哲学,希望大家喜欢!
篇1:我所信奉的编程哲学
从去年到今年,陆陆续续看完了《代码大全》、《重构》、《代码整洁之道》、《程序员修炼之道》以及《The Art of Readable Code》,获益匪浅,下面就分享几条我赞同并信奉的编程哲学,顺便废话几句。
本文适合有一定编程经验的读者阅读,高手请轻喷:)
代码是写给人看的(Coding for Reading)
请先思考,评价一段代码优劣最重要的标准是什么?
有个著名的图,相信大家都见过,讲的是Code Review时被骂WTF的次数越少,代码的质量就越高。这虽然有点无厘头,但是却不无道理。
《The Art of Readable Code》中告诉我们,评价一段代码的质量的最佳标准是可读性,即别人理解代码意图所需要的时间。
可读性有什么用,我写出一段代码,能完成目标,能通过测试不就行了吗?
不管你是团队开发,还是一个人单干,只要项目还在运作,代码总是要有人来维护的。如果有一天你不在或者离开了,别人应该能很轻松的看懂你的代码,而不是猜来猜去,最后还要来问你,甚至弃用整段代码重新再写。作为一个负责任的开发者,应该尊重自己的劳动成果,也尊重别人的时间。
当你写下一段代码时,脑子里有清晰的逻辑(比如这里必须这么做,因为……这里不能那么做,因为……)。而别人看这段代码时,脑中是一片空白(这个变量是干什么的?为什么要多加一层判断?这个数为什么是 2 不是 3 ?),除非能完整复现你当时脑中的逻辑,否则就不能理解这段代码。
所以我们应该做的是,把写代码时脑中想到的逻辑的每一个细节,尽可能地写到代码以及注释中,从而帮助后来的阅读者快速复原整个逻辑。简单来说可以有以下的方法:
用常量代替魔术数
在一段代码中出现 if ( level >3 ) ...的时候,也许你会想:为什么是 3 不是 4 呢?这就是所谓的魔术数。通过上下文也许你可以判断出这个 3 是指最高等级,但是可能这段代码中 3 出现了好几次。你会迷惑:它们是不是都是一个意思?当我要把最高等级改成 4 的时候,是不是应该修改所有的 3 ?
如果代码的作者定义一个常量MAX_LEVEL = 3,同时还有一个常量USERS_PER_PAGE = 3,并在不同的地方使用不同的常量,就不会有这样的混淆了。
使用富含信息的类名、变量名和函数名
doit;$return = $str2 . ':' . $str3;return $return;
这样的代码,简直就是人工混淆过的。你会发现这些代码根本不能帮助你理解代码的含义。
也许你该写成这样?
handleError();$error_message = $error_code . ':' . $error_status;return $error_message;
在注释中说明一段代码存在的原因,而不是行为
$('#item').html(''); //清空item的内容
这样的注释有意义么?用自然语言重新描述一次代码的行为,除了徒增维护时的工作量外没有任何价值。你应该说明为什么这样做,以供别人看到这段代码时明白你是怎么想的,并决定如何修改或者对待这段代码。
$('#item').html(''); //先清空容器的内容,否则可能导致内容重复
写得越少越好(Less is More)
这个规则的使用性太强了,我简单说说减少逻辑层次和缩小函数体这两个方面吧。
减少逻辑层次
当逻辑层次超过三层时,理解这段代码的难度会急剧上升。我相信谁也不喜欢去读一个n层括号的表达式,或者面对n层缩进的条件判断/循环,
对于复杂的表达式,通过提取中间变量来降低表达式的逻辑层次,保证每个表达式的逻辑层次不超过二层。
对于多层条件判断,大多数情况可以用防御式编程将其简化成单层的条件判断,尽早return或者exit。此外,单行的if-else判断往往可以用三元操作符替换。如果判断实在太多,也许你该重新设计一下结构了。
缩小函数体
记得有一位语言的创始人说过:“我不喜欢比我的头还大的函数”。
事实上,大家都喜欢短小精干、一眼就能看到底的代码。简洁明快的代码有助于别人迅速理解代码的意图,也方便快速定位问题。如果一个函数要滚动屏幕才能看全,那你往往要不断地来回滚动,并强迫自己记住一些信息,再返回去看另一部分,这样做会非常累。
随着函数体不断膨胀,理解它所需要的时间随之增加,出错的几率也会大大提升。而且越大的函数,可维护性和复用性越差。当部分代码逻辑需要修改时,不能快速定位到要修改的位置,也难以确定函数体其他位置是否也需要对应的修改。
当函数尺寸失控时,首先要想到的是,有没有其他方法,用更少的代码完成这个任务?能不能用正则表达式?能不能用查表法?有没有内置的库函数可以利用?
面对一个无法再简化的流程,将其拆分成细粒度的步骤,将每个步骤的相关代码分离出来,提取成子函数,再给子函数起一个漂亮的名字。这样可以降低理解主流程的难度,在做修改时也可以通过函数名快速定位,而且因为相关的代码都在一起,不容易漏改。
也许你会怀疑调用函数所造成的性能损失,我想说现在这个时代,手机都马上四核了……
不要重复(Don't Repeat Yourself)
看过《重构》一书后,我看到代码中任何重复的地方都如见眼中钉。
重复是万恶之源,当你发现你在对代码的不同部分进行同样的修改时就要警惕了。改的地方越多,就越可能出错。也许忘了改一个地方,也许错改或者删除了周边的代码……永远不要让这种事情发生!
将重复的代码提炼成子函数
$('#count').text( + $('#count').text() + 1 );...$('#count').text( + $('#count').text() + 1 );...
如果一段相同的代码出现两次,基本上你还会第三次用到它,所以很有必要将其提炼成子函数。这样不仅可以减少代码量,还可以降低维护的难度。
countPlusOne();...countPlusOne();...function countPlusOne() { $('#count').text( + $('#count').text() + 1 ); //以后修改只用改这里就好了}
如果有几段代码很相似,往往可以提取其共性逻辑,使用不同的调用参数进行区分。
countChange( +1 );...countChange( -1 );...function countChange( change ) { $('#count').text( + $('#count').text() + change ); }
用循环减少重复
$item[ 'id' ] = $_POST[ 'id' ];$item[ 'name' ] = $_POST[ 'name' ];$item[ 'mail' ] = $_POST[ 'mail' ];$item[ 'qq' ] = $_POST[ 'qq' ];
如果有大块逻辑雷同只有一两个地方更改的代码,往往可以用循环来解决:
foreach ( array( 'id', 'name', 'mail', 'qq' ) as $key ) { $item[ $key ] = $_POST[ $key ];}
篇2: 我与编程
我与编程
初次“相见”
在未接触编程之前,计算机给我的印象就是好玩:有好多好玩的游戏,好多好看的图片,还有好多搞笑的视频......直到有一天,一位新老师走进我们的教室。
“编程就是把你想要设计的东西用计算机语言编辑出来。”在四年级的时候,这位新老师走进了我们的教室,用简洁的语言告诉我们什么是编程。这话听的云里雾里,但还是因为想到有电脑就可以玩,于是也就很期待每周一次的编程课。
第一节课,老师只是简单的介绍了一下计算机的使用以及注意事项就下课了,老师给我们布置了一个家庭作业,制作一个自己的程序。
在放学路队上同学们个个讨论着自己要做什么。
“我要做一个打枪游戏,到时候你们都要来玩啊!”
“我也要做一个,就做‘植物大战僵尸’。”
“……”随着我们的讨论声回到了家,终于有个合理的理由摸一下电脑了,兴奋的打开电脑我却又傻眼了,我什么也不会做呀,只好根据自己的摸索,加上网上的查阅视频讲解,我做出了我人生的第一个作品,说真心话连我自己也看不出来我做的是什么。直到第二节课,根据老师的讲解,我才发现我做的啥也不是。
耍小聪明被识破
经过一段时间的学习,但是我发现有些知识我还是不太会灵活运用,于是这时我就想了一个歪点子――“抄”自从那天我做作品时就开始左看看右看看,跟个贼似的,虽然最后还是“做”出来了,但是我知道,这不应该受表扬,最后也一定会露馅,这可不得了。有一次老师来到了我的旁边,看到我和我同桌的作品积木一模一样,于是就问“咦,你们俩怎么做的`一模一样呢?”“不知道啊!”我们异口同声的说,虽然嘴里这么说,但我的内心可真的是慌得一批呀!
“这好办,来,我一人考你们一个问题。”老师用他“狡猾”的眼神望了一下我。
“‘移动(10)步’这是哪里的积木呀?”
“是动作盒子里的。”那位同学流利的回答道。
“那下一个造型又是哪一个积木盒子里的呢?”老师转过来问我。
“这个……那个……”
“抄别人积木是没有用的,只有用自己的知识做出来程序好,才是真正的好。”老师教导我。于是我便在心中默默发誓我一定要好好学编程。
我要与众不同
有了上次的教训,我暗自在心里发誓:我一定要创作出属于我的与众不同的作品。于是在接下来的编程学习过程中,我不再偷懒,不再投机取巧,不再玩其他无关的东西。用心后我才发现:其实编程的思维宽阔,任你香香任你发挥,是呀,干嘛要和别人做一样的呢?我要与众不同。
于是我就开始了我的“计划”,别人做这个我就要做那个,我就偏不和别人做一样的,有一次老师让我们做躲避炸弹的游戏,同学们千篇 一律的做的都是个小人在躲一个炸弹,而我却做了一个一团燃烧的火正在躲避雨点,还在雨点的外表上“添油加醋”做了一个得意的造型,还给小火苗上做了一个生气的表情,雨点碰到了火苗会得意,火苗碰到了雨点会生气,多么好玩啊!这次得到了老师的关注,当着大家的面展示了我的作品,教室里响起热烈的掌声。
有了这次的鼓励,我以后做作品更加用心了,觉得老师的鼓励就是我的动力。
我的第二个爱好
经过这一年的学习,我越来越喜欢编程了,总感觉学校每周一节课填不饱我的欲望。于是在去年的暑假,妈妈就给我报了一个校外辅导班,尽管也是每周一节课,但这一节课是一个半小时,并且人少,老师辅导的很到位,学的东西也多的多。于是我的编程水平也迅速提高,已经可以独自建造一些引人注目的游戏或程序,作品经常受到老师的表扬,展示出来给其他同学学习。
当然,我要感谢我四年级时的那位老师,如果没有他的教导,我现在可能还是一个只会抄别人方法的编程小白。也更要感谢我现在编程辅导班的超人老师,他还教会了我很多制作小技巧,比如怎样用最简洁的积木制作好程序,如何不那么费时间费精力等等。
通过这一年半编程的学习,我觉得我的思维空间以及逻辑能力都有了明显的提高,包括数学的学习上,都觉得思维比原来敏捷了很多,脑子变活了许多。我妈常说“你能对待其他作业像做编程作业那么积极认真吗?”鉴于我对它的热忱,想必编程将会成为我除了篮球以外的第二个爱好。
篇3:我不在信奉上帝小学作文
我不在信奉上帝小学作文
做为一名上帝的孩子,我一直十分虔诚的信奉着我心目中的神——上帝。
我从小就熟读《圣经》,对人类是是上帝创造出来我对此一直深信不疑,可是现在,我却再也不信奉上帝了,这是为什么呢?这件事还要从我的一次钢琴考级开始说起。 20xx年的暑假,在一个晴空万里的大好日子,我隆重的迎来了我的钢琴十级考试。一大早,我就准时的来到考场,等候考级。在我的等待下,终于要轮到我了,我的心“怦怦”直跳,好像要跳出胸腔一样,手心里也紧张地冒起汗。我迈着紧张的步伐,走到考级老师面前,递上考级证,坐在了钢琴凳上。我发挥除了平常的'水准,准确无误地弹奏出了考级曲。
考完级后,妈妈带我去吃了顿肯德基,在吃肯德基时,我一边吃,一边向上帝祷告:“亲爱的上帝啊!我万能的主啊!请您让我一定要顺利考完级啊!只要您可以让我过了这次考级,我愿意一个星期天天早餐吃大白馒头,外配白开水!” 几个月后,考级结果出来了,我和妈妈一块儿上网查询考试成绩,我按照程序输入了考级生的证号以及姓名,查询结果是一个大大的“2”,我彻底晕倒!明明我天天向上帝祈祷,请求考级通过,可偏偏造物弄人,这可恶的上帝却偏跟我对着干,难道是我不够虔诚吗?我泪奔回到房间,写了两个大大的“上帝”,放在地上,又跳又叫地大踩起来,一边踩,嘴里一边恶毒地诅咒上帝。 从此,我曾经心目中的神,已经不再存在了,我再也不信奉上帝了,可是后来我深思了一下,觉得这件事其实也不能怪上帝,凡事都要靠自己啊!
篇4:我的网络编程之旅
首先给大家推荐下Markdown,我想用过github的同僚一定很熟悉了,这篇文章的排版就是使用的markdown,以后我们不必再去适应各个博客系统自己繁杂的排版方式了,
网络编程是什么?
给大家从招聘信息上截取几段内容:
熟悉Socket编程,熟悉Tcp/Ip协议栈;
熟悉TCP/IP协议、UDP协议,有相关的协议开发经验;
熟悉网络编程/多线程编程技术;
大家应该很清晰了吧,关键词就是TCP/IP,Socket,我再附加一个多线程。下面开始我的网络编程之旅。
tcp/ip协议分析
其实协议分析并不是大众认为的网络编程的范畴,现在网络编程已经完全和socket等同了。socket是表面,TCP/IP协议是里,有了协议分析的经历更会让你的网络编程之路更加平坦。
想必有些童鞋经历过这样的公司吧,对公司内部的上网行为进行监控:你访问过哪些域名,上传下载过哪些资源,你占用了多少带宽流量,甚至你的邮件正文,附件都会呈现在监控系统上。这就是协议分析的杰作。经典的网络四层模型构成了协议分析的基础。
了解TCP/IP协议一本书足矣《TCP/IP详解 卷1:协议》,进行协议分析并也不需要我们自己从头做起,我们完全可以站在巨人的肩膀上,这个巨人就是pcap,另外还有非常知名的基于pcap实现的开源项目供我们参考,比如snort、tcpdump、wireshark特别是snort的功能模块化设计和实现非常经典,应用在大型协议分析项目中极为合适。至于作为协议分析工具的tcpdump和wireshark,不会使用的话咱就别好意思说咱是干这行的了。
socket编程
socket的扫盲书籍及文章太多太多,咱在这就不废话了。起初我有个疑问,对很多公司招聘信息上写的熟悉Socket编程感到很不解,因为我觉得是很简单的事情,无非就是调用几个API,理解下三次握手、listen...等等几个状态。之后在真正做企业级的牵扯到多Client对单Server网络编程和具体的网络环境时才慢慢理解了那些招聘信息的含义和需求深度。(以下如不特殊指定均指TCP协议)
局域网
我们这个项目主要针对局域网用户,相比广域网的网络环境,几乎可以忽略带宽考虑,用户并发数也相对较小,对性能和效率要求较低,另外业务较复杂。在这种情况下最合适的就是采用RFC(远程过程调用),于是我们首先想到了开源的RFC框架,经他人尝试推荐采用了RCF,相当于我们只需要在此框架上套上业务逻辑即可,起初在我们实践和小规模的测试中并未发现有问题,但是真正模拟到高并发情况时却在网络层出现了不可控的错误,初步判断是RCF的线程模型和我们的使用场景不一致,于是决定开发一套自己的网络库,于是在一位以前有过网游经验的研发人员的指导下,我们一起开发了一个基于boost asio的远程过程调用框架,boost asio的网络模型在windows下采用的完成端口,在类unix系统下采用的是相应的多路复用接口,由于在局域网环境下,用户并发数也不多,也就是用好boost asio,设计好网络传输协议,处理好数据封包解包就好了,并未遇到太大的问题,
电脑资料
广域网
首先抛开广域网复杂的网络环境不谈,这个产品是个互联网项目,面向普通用户,有些类似于IM软件,由于有QQ这个优秀的采用UDP协议的例子,我们也曾经在TCP和UDP协议间犹豫过,但是鉴于UDP实现的难度太大,还是采用了TCP来实现C/S通信。客户端(windows,linux,android),服务端(linux)网络库的设计编写都由我负责,考虑到以后可能出现的海量并发,在服务端我采用了master——worker模型,一个事件循环一个线程的多线程网络模型,这样可以充分利用服务器的多核资源,客户端和服务端的网络库都采用了libevent。服务端的设计思路及代码实现可以参考我的github:highPerformanceNetworkServer(这只是个演示demo,离企业及应用还有许多需要自己完善的)。
前面说到了socket编程的简单VS深度,其实你需要了解、注意、掌握的东西有很多,比如MTU,MSS,SO_LINGER,TCPNODELAY,TIMEWAIT,keepalive(最好用应用层心跳包),串话...,在实际的编写和使用中你会慢慢知道的。
另外很重要的一点就是网络传输协议的设计,这也进行socket编程的重中之重,可以参考我曾经的文章网络传输数据格式的选择。
扩展话题
UDP
UDP也属于socket编程的范畴,把他单拿出来是因为他的使用范围相比较TCP还是有局限性的。在做可靠信息传输这种应用中,腾讯QQ的技术让我们体会到了他的可靠和高效。业界也有相应的对UDP可靠传输的包装,我仔细研究过的是UDT。在我们的产品应用中,主要是使用UDP来进行NAT穿透,我和同事一起使用过UDP和UDT进行NAT穿透,很有效,但依然有局限性:比如针对对称nat。另外使用UDP来进行相对可靠的视频传输,现在我的一个同事在专心搞这块,我想以后从他那一定可以学到不少更深的技术。
多线程
如果搞网络编程不掌握多线程就好像你只有一条腿一般。比如我前面说所的master——worker模型,一个事件循环一个线程,一些涉及到IO bound、CPU bound、心跳包、客户端抢带宽都可以利用线程来进行相应的解决。
Python
用python来写网络测试脚本,事半功倍。
推荐书籍
《TCP/IP详解 卷1:协议》
《UNIX网络编程》
这两本书不用多说,大家肯定都铁铁的知道经典程度。
《Linux多线程服务端编程》
这本陈硕老师的书籍实战性很强,讲述的思维和问题都是和实战紧密相联的。我感觉代码部分比较复杂,用了不少我不熟悉的c++特性,还需进一步学习理解
本文出自 “永远的朋友” 博客,请务必保留此出处yaocoder.blog.51cto.com/2668309/1193313
篇5:我学会了游戏编程作文
我学会了游戏编程作文
说到游戏,大家一定很熟悉吧。每当我玩游戏的时候,我总会想:这么好玩的游戏到底是怎么做成的呢?于是,我便去问妈妈,妈妈说:“游戏是用编程编出来的。”这么说编程课可是个奇妙的东西呢!不知它还能做出什么?带着好奇心,我便请求妈妈为我报一个编程班。起初妈妈不同意,耐不住我的软磨硬泡,妈妈才同意让我上编程班。
这天,开始上课了。我兴致勃勃地打开电脑认真地上课。通过老师的一一讲解,我终于知道了,编程就是将一个个信息模块叠加在一起,从而让目标物做出指令的`过程。这可真是有趣啊!看起来挺简单,不过老师也告诫我们:“学编程并不是很简单的事,不能掉以轻心,因为还要懂英文,还有许多页面及复杂的模块。”看来,我不能小看这编程课。
一节课的讲解不知不觉地过去了。老师讲完了课就让我们做练习,看着这密密麻麻的英文,我眼花缭乱了,我只好用笔一个个指着读,如果遇到不懂的单词只能一个一个查词典,遇到模块搭建卡壳还需要重新看回放……。哎,这可真难呀。当我好不容易做到了最后一个关卡时,就彻底被难倒了,这次人物既要渡河,又要伐木,模块运用还不能超数。我先试着编边造桥边伐木的程序,我一步步地计算着人物走的步数,可是当我把模块放上去时,发现在小岛上的人物还是在造桥,最后还自己撞到了桥上。看来这个方法不行。
不然,试一下造桥和伐木分开的吧!我又尝试了一次,通过移动模块,这次总算可以达到目的地了,可是新问题又出现,我使用的模块太多了,没办法达到最优化,怎么办呢?我绞尽脑汁也想不出来,我垂头丧气地对妈妈说:“妈妈,这个游戏我编不来了,你帮我想一下。”可妈妈听了,摇摇头,语重心长地对我说:“这个我没学过,我也不会,不过,你要知道我们做人做事都要坚持到底,不能一遇到困难就退缩呀,再想想,我相信你一定可以成功。”听了妈妈的话,我只好又重整旗鼓,开始想办法。一次,两次,三次……。到了第八次还是不成功,我暗暗地鼓励自己:一定能成功的,别急,再想想,一定行的。对了,老师说程序太多,可以用循环。我终于想到新办法了。于是,我先将循环模块拖出来,把要循环的模块放进去,再仔细计算循环的次数,最后小心翼翼地输入循环数字,当我心惊肉跳地按下确认键,屏幕上马上跳出:闯关成功!耶,我激动得跳起来。看着自己亲手编出了游戏,我心里别提多开心。
看来妈妈说得对,我们做任何事都不能轻言放弃,一定要坚持到底,俗话说:“一份耕耘一份收获,”通过这次学习编程,不仅让我学到了一项新技能,更让我懂得了坚持的道理。我想:以后不管在学习上,还是在生活上,我也一定要这样做到。
★ 信奉的反义词
★ 编程简历范文
★ 编程实习心得体会
★ 数控编程简历
★ 编程语言排名
★ 哲学论文
★ 关于哲学的范文
★ 我所喜欢的诗歌
我所信奉的编程哲学(集锦5篇)




