开发经验(漫谈)

我没有快速学习的能力,我不得不在时间花费上非常谨慎。我希望尽可能地学习到有持久生命力的技能,即不会在几年内就过时的技术。只要占主导地位的计算模型体系不变,我们如今使用的数据结构与算法在未来也会以另外的形式继续适用,也会成为程序员职业生涯中一笔长期巨大的财富。


我要重新发明轮子:在实现一个简单东西的时候,与其去花时间精力调查有没有能用的轮子,以及哪个轮子最好用,可能还不如自己实现一套,而且还对代码聊熟于心,


项目管理:
1、管理者是时针,下属是分针,秒针自动找他校对,对于领导,起到看点和到点报时的作用
2、管理者根据需求,必须完成,不完成,弹性完成,来对应相应的时间,对于领导,代替其掌控进度,提出授权需求
3、领导者,提出要求,最终,管理者的需求和领导者的要求要达成某种平衡,才可继续合作 


《项目2015.12》 1.页面 -- 数据计算 2.curd - 数据流程 3.交互 - 用户流程 4.流程 - 事务流程 5.自测 - 流程走通 6.测试 - 需求测试 7.上线 - 线上追踪 
  不同场景下,多个系统配合,达成某个事件(一个事-->多个操作-->多张表(基础表-充值+提现 扩展表-用户和银行卡 汇总表--余额+流水))
  项目流程(用户需求) -->状态变化(用户操作)-->页面跳转(用户体验)
  单个状态(顺序) 多个状态(阶段) 多个系统(调适)
  不同客户端(pc wap app)  不同环境(dev test product) 不同流程(原有 新增 临时添加)




#项目选项#不同渠道(pc wap-alipay+weixin) 不同环境(product test localhost) 不同流程 (前后台 +内外系统+软硬环境)  
---------------------------------------------------------------------------------------------
前端 后端      ==>  接口功能一致  有出有入 
PC   WAP       ==> 操作环境一致  线上线下  
本系统 其他系统 ==> 调用返回一致  同步异步
接口:前台(支付购买 钱包用户信息 )| 后台(支付退款 钱包收益提现)                 
退款==>客户端:pc(同步+生产) | wap(异步(weixin+测试 alipay+生产))
异步==>zc(收益+一键退款)+wallet(wap更新数据)     
---------------------------------------------------------------------------------------
上线前:改代码 布环境 测线上
业务流程  状态变化   页面跳转
用户需求   用户数据(新老)   用户体验
痛点         安全           黏性


工作中的几点问题: 1、主动; 主动工作,主动推进问题的解决; 2、给领导出选择题; 不要简单问题都自己不动脑子; 3、永远不要和业务部门,说无法实现; 因为很多时候,一个开发无法实现的东西,并不是整个开发团队都做不出来。


#问题排查#数据异常-代码逻辑-系统日志-新老系统交替导致-批量延后处理-新数据不影响-新规则…


状况共有=目标共存+信息共享


#懦弱的程序员#然而就是同样的程序员,当你让他去和不熟悉的同事聊几句话,让他和老板表达下意见,让他和客户说明下情况,他的斗志就立马消失地无隐无踪了。这时另一个程序员站了出来,征服了同事、征服了老板、征服了客户,他就成了老板,虽然大伙都知道他写的代码真的不咋的,也没什么拷问机器的能力


设计心理学:概念模式+预设用途+限制因素+反馈;自然匹配+可视性;评估+目标+执行;设计模式+概念模式+系统表象;


#数据#就像两股气旋相遇,电闪雷鸣是避免不了的,这还是容易找的问题,更隐秘的问题是,看似平静的海面下其实暗流涌动,经验丰富的程序员能敏捷的感受到海面下的暗流,也就是数据的扰动,码农,不是搬运代码,而是通过代码搬运数据,产品经理,是给数据制定规则的人,数据挖掘既是掘金机,又是捕鲸船


#数据#,数据是流动的,就像水一样,而数据库就像汪洋大海,程序员划着小船在数据之海上航行,小心翼翼地 找到并解决一个个漩涡,而高并发仿佛就像巨浪,程序员不仅仅是在数据之海上航行,还要寻找某种规律,就像洋流和磁场,虽然这种规律是之前人为建立的,但当这些规律交互的时候就会出现问题


需求变化-开发成本上升-工期延时-延时加剧需求变化-出现冗余需求提升开发成本-开发重新排期
没事的时候就盯着这个表,谨记第一条,时刻提醒自己哪些任务还没有完成。


#代码#黑客思维编写代码,了解黑客代码只不过是原有功能的扩展。允许漏洞,但不允许使用漏洞的方式存在。程序猿要让数据在指定情境下运行,就是某种限制下的选定得功能,而不是只是实现了功能,哪种环境都能运行。


“面向对象编程语言的问题在于,它总是附带着所有它需要的隐含环境。你想要一个香蕉,但得到的却是一个大猩猩拿着香蕉,而其还有整个丛林。” — Joe Armstrong(Erlang语言发明人)


资源是否一定对应硬件?     1)CPU,内存,磁盘,带宽都有对应的硬件,那些没有硬件对应的资源呢?文件描述符,端口数,进程数是不是资源?     2)路由表,iptables,cron是不是资源?     3)MySQL主从,第三方REST接口是不是资源?


应该让自己的评价来源多起来


#bug#更新都有做不完的测试、解决不完的平台问题,调查不完的诡异边缘情况,看不完的漏洞报告


如果你是一个优秀的程序员, 你理解程序内在逻辑, 你能对业务进行逻辑抽象, 你了解多项技术并合理应用, 你不把自己当做一个仅"能干活"的码农


#不要惊慌#冷静的性格以及能够在艰苦的条件下保持冷静是成为一名好的工程师的关键,问题总会出现,没有办法消除每一个可能的问题或错误。作为工程师,你工作的一部分就是能用平静的神态和善于分析的性格对问题做出反应。


#技术管理# 技术过硬+ 沟通 + 领导 + 学会观察 + 拆解任务+   顾全大局+  分析客户+  培养下属+ 当断则断


保持项目简单 当访问量增长时只需简单的添加相同的东西即可 你需要把数据均匀的分散开,来解决增长的负载 节点间移动的数据越少,架构越稳定。这就是他们为什么从集群迁移到了分片 面向服务架构原则 不要害怕丢失一点数据。把用户数据放在内存里,最多丢失几小时的数据,但系统更简单更健壮,这很关键


年轻人,不要相信什么"码农"的宿命,也不要相信"人力成本"提高会导致软件行业受到冲击,不会的,美国的人力成本那么高,软件行业受到冲击了?瑞典、芬兰的软件行业因为人力成本那么高而受到冲击了? 听这种扯淡,不如睡睡好觉,听听音乐,保持好心态,做有意义的事情,迎接未来


一是一定要精读一个有点规模的程序。精读是指每行都读懂,在白纸上能画出来这个程序的基本结构。只要用心,大部分程序尤其是应用程序,半年绝对可以达到他说的这程度。假设谁用这方法搞定了WordPress,那这人PHP一定可以突飞猛进到一个超过许多人的程度。 


当你发现一种新技术看起来很有用或很有趣时,做个笔记,几周或几月后在回来看看它,如果人们还在谈论它,那么,你就应该进一步研究它


优秀程序员:我优化代码。更优秀程序员:我设计数据。最优秀程序员:他们的不同之处是什么?


不停练习,直到你能快速且正确地写出小的代码片段。没有任何理由用自己喜欢的语言写不出一个双循环。找一些带有例子的小的代码智力题,你能在一分钟以内理解这些问题。对这类问题做成百上千遍的练习(不仅仅是几十遍,切记!)。


好多同事和朋友和我聊过离职的话题,我对朋友们的建议是,如果你因为觉得工作不爽,那就别离职,因为甭管到哪里,都会不爽:老板不喜欢、同事不可爱、工作太劳累、关系太复杂……我以我在多家大公司工作的经历担保:几乎所有我工作过的公司,令人不爽的事儿都是一样的。

程序员不可怕,如果程序员还会做数据分析、会精准运营,这个就太可怕了。

白纸写代码是一项重要的基本功,包括边界条件考虑、书写风格等等,会直接决定面试官对你的印象,

系统扩展的三种维度  : 水平 垂直和按用户

中断 :中断请求 中断响应  现场保护 中断处理 恢复现场  中断返回 并发:多进程 --》多任务 --》并发/并行--》可抢占任务

类和对象都会有「自省」的能力。自省是说,这个对象在运行时,能够了解自己。比如 Java 语言,可以通过反射,了解自己的类名、成员变量和成员函数。

#编程思想#异步,不知什么时候响应;多进程,不知什么时候执行:并发,不知数据规则是否起作用

大数据逻辑:拆分在磁盘+hash统计频度+堆排序 方法: 分而治之 双层桶  bloom/bitmap trie/数据库/倒排索引 外排序 分布式mapreduce/reduce

#七层协议#物理层 数据链路层 网络层(IP) 传输层(TCP) 会话层(RPC SQL) 表示层(ASCII) 应用层(HTTP TELNET FTP)

脏读--数据不够准确,重点是读取(A正改,B读了,A回滚了,B读了);不可重复读--原始版本没了,重点是修改(A正改,B读了,A改了,B读了);幻读--与预想不同,重点是增删(A正改,B也改,A再读)。级别高低是:脏读 < 不可重复读 < 幻读


持续集成是什么?    设计 开发 测试 发布


#推荐# 点击 和 相似 :人+产品=行为标签

你可以把它想做是一种心理上的杂耍(边抛边接:通过轮流抛接,使两个或两个以上的物体同时保持在空中) – 程序要求你在空中(精神上)保持的球越多,你就越可能漏掉其中的某一个,从而导致设计或编码的错误。


请把设计看成是一个险恶的、杂乱的和启发式的过程,


开发高质量代码最终并没有要求你付出更多,只是你需要对资源进行重新分配,以低廉的成本来防止缺陷的出现,从而避免代驾高昂的修正工作。



很多错误是由于没有彻底地理解设计



定义清楚干净代码和拙劣代码之间的边界,然后尝试把代码移过这条边界



在其他条件都相等的时候,大项目的生产率会低于小项目。而大项目的每千行代码错误会高于小项目。在小项目里的一些看起来“理当如此”的活动在大项目中必须仔细地计划。


编程工作本质上是项无法监督的工作,因为没人真正清楚你正在做什么



进度落后时,增加时间通常并不可行


solve:现象+ 问题+方法; 
问题是模糊,解决问题思路是清楚,
缕清思路,话说清楚; 
具体实现:单调+联调(log 路径 代码变化 页面跳转)


具有面向对象思维方式的人可以对复杂混乱的事物进行抽象,具有很强的分类能力,化繁为简,程序更加模块化,程序共享度得到提高,具有大程序、超大程序开发能力。


好程序: 逻辑 用词 短小 精炼 一致


编程效率:
一、程序剪短
二、减少循环内操作
三、充分利用缓存
四、减少I/O操作
五、提高调用效率
六、使用全局变量


很多情况下,你不喜欢的东西可能包含着对你有用的东西。程序员通过编写程序走向技术成熟,通过用户需求感受价值获取的市场 


人的价值不在于你知不知道,而在于你知道后做了些什么 


程序员在初期要大量的编写程序,不要管编的质量好不好,先把编写语句的数量搞上去,水平自然而然机上去了。不编到上万行语句,程序员是很难找到感觉的。 


程序规范:类 函数 变量 注释
程序的参数化:如何将事物抽象成参数  参数如何存放  程序对参数的处理


关键是要有增强自己能力的意识和紧迫感,千方百计寻找机会和别人交流


克服小我: 


1、降低兴奋程度,杜绝自信虚高 
2、程序是给别人看的 
3、编写前最好将自己的编程思路与其他程序员进行交流和沟通 
4、当别的程序员提出想法时,应积极思考,可适当提出想法 
5、关心项目进展 
6、强迫自己写好文档 
7、不要轻易挑战别人 
8、倾听用户需求 



抽象类和接口的区别-如果多个类的继承如此糟糕,为什么它可以实现许多接口呢?是由于SAP(单一职责)的需要,接口的重点在于提供特定函数,而抽象类还在于子类实现的相似性


请多写写不一样的好代码,切莫一个挫代码能用就行的心态,到处写,这会让你的技术停留不前


Write Back套路,一句说就是,在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。 但是,其带来的问题是,数据不是强一致性的 



#引用#是传址,无需返回值;传值是复制一份新的,申请内存空间,和原先的没关系,需要返回



ip解析-tcp连接-http数据-web渲染-浏览器预取


DNS 原理入门:由后向前 分级查询


就是在 99.99% 的情况下 php 的 session 都适合存在 redis 里


【redis 运维纪录】redis如果每60s更改记录数过万条就会dump(磁盘没闲着),而且是通过fork子进程dump(内存占用翻倍,cpu打满)。解决方法,可考虑把dump时间改为30m 有一次写修改就dump一次,而且主不dump,启动时只是download数据,不然的话加载数据前无法提供服务,dump交给从 




【Redis作者谈Redis应用场景】取最新N个数据的操作,排行榜应用,取TOP N操作,需要精准设定过期时间的应用,计数器,Uniq操作,获取某段时间所有数据排重值,ub/Sub构建实时消息系统,队列系统,缓存


【基于Redis构建系统的经验和教训】)持久化, 复制和备份带来的系统和网络问题,无分布式方案导致软件设计的复杂度增加.Redis 不适合作为海量数据存储方案. Redis 适合在数据规模较小, 性能要求较高的条件下应用


【Redis消息队列的若干实现方式】最近忙着用Redis实现一个消息通知系统,今天大概总结了一下技术细节,其中演示代码如果没有特殊说明,使用的都是PhpRedis扩展来实现的。 


key value:存取内容(mysql mongodb   mc redis  session cookie global local )存取介质(free disk)存取时限(gc)存取规则(sharding)


进程 vs 线程 :一个进程可以包含多个线程 - 进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。 最近,我读到一篇材料,


聚集 vs 非聚集 - 存储引擎的区别,存储顺序和存储内容不同: 聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索引顺序与数据物 


#mysql#为啥不用null,索引+空间,Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间, 还需要mysql内部进行特殊处理。可空列被索引后,每条记录都需要一个额外的字节,


RDS MySQL空间优化最佳实践:在RDS控制台中可以看到空间的组成分为了5部分,分别为:磁盘总空间,数据空间,日志空间,临时文件空间,系统文件空间。


#nginx架构# web响应机制(多进程和异步非阻塞) + 事件驱动(select poll epoll)+设计架构(client-->master-workers(cache)-->servers)


empty    如果 变量 是非空或非零的值,则 empty() 返回 FALSE。换句话说,""、0、"0"、NULL、FALSE、array()、var $var、未定义; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。


C/S结构,即Client/Server(客户机/服务器),降低了系统的通讯开销,充分利用两端硬件环境的优势 ; B/S结构,即Browser/Server(浏览器/服务器)结构,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,主要事务逻辑在服务器端实现,形成3-tier结构


消息分组,快慢分离 数据无锁操作 部署拆分,降低相互影响


缓存穿透、缓存并发、缓存失效之思路变迁  


有了事务为什么还需要乐观锁和悲观锁




#json#转码后中文不变  $tags= preg_replace("#\\\u([0-9a-f]+)#ie", "iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))", $json);


#不求甚解#global和引用:函数传引用,它的值在函数外也可拿到,有点像global,区别是global必须同名;global和$_GLOBAL:不过函数内给global变量加引用,则只在函数内有效,但是如果换成$_GLOBAL,就能把变量拿到函数外面去,


cookie + session - setcookie('here',time(),time()+10,'/here/','.ok.cn'); se 原文地址


good:闭包 动态对象 对象字面量和数组字面量 其实javascript里的闭包概念很简单,就是函数用到外部变量


#前端#事件 性能 闭包 钩子 跨域 自适应 


PHP的文件上传受到php.ini以下这些设置的影响:  post_max_size  upload_max_filesize  max_execution_time  memory_limit


cookie 增删 介质 命名


date+session+url+hash+variable+http+array(元素+集合+搜索+排序+kv)+string(转换+编码+加密+搜索+分割)




MaxClients是这些指令中最为重要的一个,设定的是 Apache可以同时处理的请求,是对Apache性能影响最大的参数。缺省值150是不够的,如果请求总数已达到这个值(ps -ef|grep http|wc -l),那么后面的请求就要排队。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。

开发经验(漫谈)_第1张图片

开发经验(漫谈)_第2张图片

开发经验(漫谈)_第3张图片

开发经验(漫谈)_第4张图片开发经验(漫谈)_第5张图片


开发经验(漫谈)_第6张图片


开发经验(漫谈)_第7张图片


开发经验(漫谈)_第8张图片

开发经验(漫谈)_第9张图片


开发经验(漫谈)_第10张图片

你可能感兴趣的:(开发经验(漫谈))