获得徽章 0
开源运动有一本“圣经”《大教堂与集市》,本来讲的是软件大企业集中力量创造商业软件系统与开源社区成千上万开发者的开源生态贡献。

让我们对这本书发散预测一下,看看技术推动社会发展的趋势:

如果把资本在城市化的互联网技术投入所形成的互联网商业平台比作大教堂,让所有人向往与朝拜;那么大众创业,万众创新就可以比作将来突破内卷的乡村生态经济的集市,大教堂的特征是中心化,而集市的特征是分散、去中心化。

我想这才是区块链网络、大数据技术的上层应用所形成的共识机制、推荐机制、撮合机制在将来真正最广泛的用武之地。
展开
守护石于2022-07-05 21:09发布的图片
评论
今天写了一篇博文,是论程序员的天赋,而由此深度的写作中思考,发现天赋与天分是不同的。

天分代表了你在某个领域有悟性,或者说有几分是天赐的聪明,然而天分不能与天赋划等号。

若天分过人,但不努力也不持续付出,一样只是成就平平,甚至还远不如有些天分缺乏者的成就。

那什么是天赋?那就是一种才华,天赐之。

什么是天赐,就是遵循了正确的自然规律。

然而才华不是来自先天白给的,而是后天对于目标的持续努力所铸形,等量变到质变的那一刻,会吸引神去触碰你的成就,并使你的精神开悟,也可以将其称之为有如神助。

我们不避苦难,十年如一日的专注自己的事情,持续地提升,必然你的人格得到提升,也会结出丰硕的果实。

因此往往很多天分一般的人最终都成了具有天赋的程序员,例如我[捂脸] #重启人生,由你决定#
展开
评论
列一下自己的Java编程秘籍

① 新建项目尽量用Maven这样的包依赖管理工具来做,不要图省事,自定义创建工程再朝着自定义的lib目录里面乱丢jar包,往后的日子还长,若扩展增加新功能,jar包管理是个麻烦。

② 需要单元测试了,在test源代码路径下好好建立一个Junit类做测试,而不是在src源路径下随意找个类在Main入口就开始搞了,这些测试代码处处威胁着工程和生产。

③ 工程创建之初就先导入log4j相关包和配置,测试调试尽量用log.debug而不是System.Out.println,满屏输出跟张麻子的脸一样,时间久了都不知道哪块打印的。

④ 新手不要用单态模式,老老实实用new,因为并发控制你还没有理解到位,别自以为懂性能,或许一个IO优化就顶你少new一万次对象的优化。

⑤ 热衷于对象封装的高手,如果你提供的对象接口让别人需要三次以上引用才能到达方法,请重新优化为最多两次引用即可,否则你提供的接口很烂。

⑥ 一个类里面的方法多少合适? 除了取决于类要对外提供的方法,还取决于不可能再有重复代码的私有方法。

⑦ 需要加载到工程的静态资源,不是静态常量就是可配置属性,硬编码的静态常量一定不会变化,通过属性加载的资源一定是为了变化调整。

⑧ 尽量不要用1,2,3这些标识各种状态,请改用枚举,易于别人理解,也防止了各种直写1,2,3的难以维护的代码出现。

⑨ 数据流处理一定使用队列,队列一定是发送接收两端使用线程,不要自己控制线程,请使用阻塞队列解决。

⑩ 单一方法的匿名内部类,请使用lambda语法,更清晰,但lambda别滥用,导致阅读理解的困难。

⑪ try>资源调用 catch>异常 finally>资源释放,这个流程不能乱。

⑫ if else 最多嵌套三层,再多就要重构新的私有方法,甚至三层都多了。

⑬ map list集合里面的内容要是复杂,别搞成map套map,或者list套map,甚至更多层的集合嵌套,尽量外部就一层集合,里面用自定义的内部类,内部类里面可以是成员以及集合,自己麻烦点,但以后调用很舒服。

⑭ 能用正则摘出来的关键字,就别用程序硬找,正则是对付字符串的一剂良药。

⑮ 能用单元测试跑出来的结果,就尽量别用在服务器上跑,更好的mock出来的外部依赖可以提升上百倍的开发效率。
展开
守护石于2022-06-08 22:03发布的图片
评论
编程更容易形成频次多、周期短的成就感,而成就感又是治疗自卑,提升自信的良药。

以我自己的世界观来看,每一位牛逼的编程者,总会藏着一个不自信的过去,否则很难去解释,对于编程乐此不彼的持续热情。

人类能分泌的情绪激素,一种是多巴胺用于激发快乐,还有另一种就是内啡肽,抚慰心态,增强信心,然而唯有成就感那一刻,能同时激发出这两种激素。

为什么编程就特别容易形成成就感呢?那就是因为编程不同于其他工作:理论先行,设计为重,实践最末,往往很多人都停留在了理论和设计阶段就止步了!

但是编程很有意思,它一定是提出假设,简约设计,重在实践和体验反馈,然后才是重构设计,最终才能系统地理解,清晰整个系统的机理。

那么这个过程就很有意思了,就好像打游戏一样,我们总是先从活动和体验当中获得快感,然后不断被对手KO,然后不断发现自身问题(很难得),重塑自身能力,然后再去KO对手,获得满足感。

但又有着比游戏更有价值的事情,那就是系统性地去解剖了一项看似混沌不清的事物,在不断地打怪升级(编程能力提升)当中,成为了一个领域的专家。

举个例子吧:我03年入行第一个项目就是做一个增删改查的模块,那时候我连数据库的一对多关联设计都不懂,领导给我了一个复杂的框架组合,并要求我在上面去开发表单编辑、确认、提交的交互式模块,在现在开来的确比较简单,但那时候也是比较复杂的事情。

首先在领导的指点下,我弄懂并创建出了数据库中供应商管理的父子表的设计关系,成就感+1,接着我照猫画虎的搞清楚了jdbc如何curd的各种SQL,+1,再接着我用eclipse插件会部署ejb2,实现了stateless bean,+1,顺便搞清楚了事务意义,+1,再接着我通过struts实现了action跳转,+1,明白了struts和servlet的关系,+1....

最终我在客户现场,一个煤矿的办公楼的小办公室,看到了一群用户正从一打本子上的找到供应商,录入进我们系统中我开发的模块表单中,并提出了一些建议,都是如何省时省力的操作建议,顺便对查询和排序功能大加赞赏,这就是最终一次成就感的大反馈。

我们可以看到,编程就是不断去实践,不断反馈体验,不断调整设计,不断深化理解的过程,也许这种反馈来自电脑,也许来自人,成就感不大,但总是不断出现,累加在一起,就是持续地满足。

因此一旦你进了编程的道,就一定会喜欢上它!
展开
守护石于2022-06-04 13:58发布的图片
1
新人学习编程另一个思维的转换就是系统性,这对于新人也极为重要,什么是系统性:通过前因、过程和传递的信息,最终得到结果。

例如:我们通常听厉害的人讲话,抛出个话题,一件事又一件事的讲,最终又回到话题本身,其实就是通过不同事件分析去论证他自己想要表达的话题观点。这样听众很容易被带入节奏。

编程思维也是一样,要有系统性逻辑,问题假设、调用过程、传递参数和结果输出,对吧!
而新人往往都是点状思维,所谓点状就是想到哪,说到哪,思维非常发散,各种问题互相交织,听者云里雾里,这种思维写出的程序可想而知,往往自己的程序能把自己带入到懵逼的世界。

因此作为新人学编程一定是要先训练自己进入一种慢斯条理的思维方式,在这种基础上,让自己的思维越变越敏捷。

例如:我现在看到一页纸的需求,几分钟内就大概猜出了客户的需求想法,在脑海中规划出了整个系统的架构。

这不是一朝一夕养成的,而是十几年如一日的开发实践中历练出来的,也就是让系统化思维这根神经越老越粗壮,这才能保证更稳定更快速的带宽,让需求、开发和架构逻辑能高速地在自己的神经网络中通过。
展开
守护石于2022-06-02 21:48发布的图片
评论
学习编程的第一要诀,就是对问题解答的明确化,什么是明确化?一就是一,二就是二。

但是我们文化的特色是话说一半,自行意会,话不伤人,久而久之就形成了对问题的明确定义的模糊化处理。

作为社会关系处理上,也许是一种有效的关系相处之道,但是作为写程序上就特别要不得啦!反过来也就能理解为什么程序员与人沟通比较吃亏。

其实说这些的目的是针对于初学编程的新人的,在编程学习上,一定首先要养成一种习惯,那就是明确,任何一个细节的明确。

最怕就是新人总有一种思维:程序某个细节上的问题或许是我,或许是别人,或许是底层导致的问题,总之模棱两可的心态看待程序,最终程序一定让你的学习之路越走越黑。

因此学习编程的新人从现在开始,一定不要轻易放过自己思维模糊的习惯,一步步训练自己把发生在自己程序中的事情,明确了,到底是什么导致的?当你搞清楚原因所在时,往往都是自己脑子糊涂导致的。
展开
守护石于2022-05-30 17:09发布的图片
评论
稻盛和夫在自己的书里说:“每一秒钟的积累成为今天这一天;每一天的积累成为一周,一月,一年,乃至人的一生。同时,’伟大的事业’乃是’朴实,枯燥工作’的积累。那些让人惊奇的伟业,实际上,几乎都是极为普通的人兢兢业业,一步一步持续积累的结果。”

其实这句话非常非常适合不懂得钻营的人,我真的搞不了为了中标一个大项目熬上两天两夜对标书进行逐行逐字的研究斟酌,我也搞不了为了打通一层关系,每天绞尽脑汁的研究对方,投其所好。

因为老实人最好的活法就是稻盛哲学,每天一点点积累,哪怕今天各自糟心事缠身,但始终不忘初心,坚持自己想做的想学的那件事情,每天都有进步就可以了,一步登天的事情自己是勉强不来的,那么二十年如一日,曾经自己所向往的样子也就如同现在这个样子。 #我的宝藏书籍#
展开
守护石于2022-05-17 10:12发布的图片
2
当你的软件设计能力到了何种程度就算不错了呢?

其实编程学习犹如丫丫学步,能写好一个接口,串成一条流程,形成一支业务,对于刚起步的程序员就算不错了。

逐渐的你开始带项目,从混沌中不断犯错,总要有个练手的项目,常言道医死的人越多,证明医术越高明,带项目也是一样的,经历过不成功的项目越多,证明项目经验越丰富。

当然这不是在为那些失败的项目管理者找借口,每个优秀PM一生总有四五六七八个说不完的成功案例。

那么到了我这种老司机的程度,大概5年程序员,10年PM,5年架构师的经验,软件开发的成熟度是什么样子呢?

(1)写个代码模块一次过的概率很高。
(2)拿到一页纸的需求,就能勾勒出客户的想法,形成直击用户内心的方案。
(3)很少从零搭建系统,而是经常把一个破旧的老爷车,东拆西拼魔改成一辆超跑。

你什么时候也可以呢?
展开
守护石于2022-05-10 22:27发布的图片
3
编程语言归根结底就是对数据的处理吗?

这么讲是有道理的,但并不是绝对的。

的确,编程的基本逻辑就是输入与输出,其中的参数就是数据的载体,我们把它们叫做数据的结构。

但是如果我们仅仅理解编程就是对数据的输入源定义,到输出目的定义,以及传输过程的定义,那么这种理解就太狭隘啦!

作为大数据系统,自始至终贯穿的问题都是怎么解决数据的问题,因此我们可以认为归根结底就是在解决数据如何进行处理。

不过应用系统,也就是在线业务的应用系统,其本质就不适合将数据处理作为编程的底层逻辑。

那么什么才是呢?

我认为是:模型,模型的驱动才是业务应用系统的底层逻辑,因为模型是对真实世界的业务(样貌、特征与行为),在软件系统中再构建出的一种很形象地映射。

我们基于模型之后,对编程本质的输入,输出建立了更高层的抽象,而这种抽象就是团队之间协作通用又能准确理解的表达力,那么顺着模型去设计,就好像程序师抓住了一个线头一样,一点点拉动,就能将复杂的业务问题逐渐显露出来,再通过编程逻辑和数据处理的技巧加以解决。

因此我认为模型和数据处理是编程领域归根结底的两条腿,缺一不可。
展开
守护石于2022-05-06 14:17发布的图片
评论
经验分享,负责项目在前期需要注意的事情有哪些?

技术人提升能力到一定阶段就要负责项目,开始的很长一段时间都会极不适应,为什么呢?那就是用技术思维去应对复杂的人文环境。

项目首先是理解需求,而需求不仅来自于客户的实际生产需要,还有个人的主观性,我们将其分为二八原则,主观性只占两成,但是你的方案如果不照顾到这两成需要,很有可能项目前进过程不断被否定。

就好像你自己去商场买手机,质量功能再好,只有白色款,可你想要黑色,你就想想你当时的心情,这种主观性往往对于客户的心态影响其实很大。

其次是项目的前期文档价值总是被技术人低估,也就是很多程序员代码写得一流,但是写开文档即便使出洪荒之力最多憋出一句话的状态,这就是长期不锻炼写作所导致的生涩。

可是文档在项目前期的作用极为关键,梳理清晰文档,不仅有助于解决内部项目工作任务分解的目标,而且前期项目成本,开发周期,合作方对接,若没有清晰文档的责任边界,很可能将自家的利益拱手送人。

其实对于文档书写困难的很多技术人,我的建议是:一定先要梳理出大纲,下笔无墨时,可以基于章节的关注点,先绘图功能间关系图例,对照图例去描述文字,就有抓地力了!

最后就是项目开发启动过程尽量按照原型、协议、模型、环境搭建后再陆续团队的任务开发。

原型很重要,尤其是在确认需求的阶段,也是指导开发的重要文件,不要给出朦朦胧胧的原型界面,而是具有一定交互的原型集合,人是感性和理想相结合的生灵,视觉感受会极大促进理性思考。

开发前期合作方AB,BC,CD等等之间的协议一定先行,用json?json的业务语义设计?接口调用方法等等,这些事情要认为是基础层,且非常独立,大家的功能又对其紧密依赖,那么一定是协议清晰,各司其职的项目管理方法。

模型代表了项目建设所关注的各个领域进行建模,模型来驱动,界面、数据关系、业务处理这些都是模型作为一条条血管,连通了起来。

这些做完后别忘了环境的搭建,让工程师们在一个共识,统一风格的基础环境上做开发,不要在项目中期或后期因为环境问题,对接不到一起,测试工程师更是恼火。

好吧,就聊这些,项目开发是软件行业的普遍情况,项目负责人就是项目的精神支柱,好好把握住项目节奏,就是对所有参与者最大的负责。
展开
守护石于2022-05-04 13:14发布的图片
评论
昨天晚上写书过程中,发现自己设计的一段kafka自定义分区代码很幼稚,大失所望。

因此重新设计了一下思路,折腾到12点,才达到了满意,也等来了五一[捂脸]

#一句话证明自己是程序员#
核心部件的编程思想是什么?就是不断地提升抽象力,让你的代码在你所关注的领域中,适应更普遍的情况。
展开
守护石于2022-05-01 22:03发布的图片
3
代码乐趣分享,给程序员的小伙伴们看一段代码,你若看懂了,证明你是个玩Kafka的行家。

① 这是一个Kafka生产者的分区策略
②默认的分区策略就是用murmur2哈希算法对消息Key取模得到消息存放的分区位置
③但是我自定义了这个分区->继承了DefaultPartitioner
④我自定义的目的:只要Kafka Key为:0000001:XXXXX ... 000000N:XXXXX,都按照前缀取模(N/分区数)=分区位置,就能按照前缀分组存放Key到指定的分区。

为什么要这么做呢?

因为我采集数据库中的数据表事务操作的记录,发给Kafka,但是我以数据表名作为表记录的前缀进行分组,那么只要是相同数据表的记录一定会进入相同的Kafka分区,那么就保证了数据表记录进入Kafka分区后,形成先后次序的队列。

这其实就是一种通过Kafka实现ETL又能保证数据库事务的手段!
展开
守护石于2022-04-19 23:02发布的图片
4
下一页
个人成就
文章被点赞23
文章被阅读9,952
掘力值716
收藏集
0
关注标签
0
加入于