求上得中,换工作的小故事
求上得中,换工作的小故事转眼间在程序员这个行业已经工作一年多了,一年前我兴奋的写下:勇闯SAP失败,勇敢转行成功,现在结合这一年来发生的故事,想再写点儿有意思的事儿。
去年入职后,我在一家创业团队里负责java后端开发,工作中遇到的问题都感到新奇。每一天都过的充实开心,在业余时间也会经常看看书,比如: 《码农翻身》,《程序员的职业素养》之类的,我发现作者们都提到了一种优雅的编程语言:ruby,相信大部分人可能都不知道这个名字,而市面上主流的培训机构也没有这门语言的身影,从就业情况来看,在Boss直聘上西安使用它的公司仅有三四个。而使用java的公司已是成百上千。好吧,那看来学习它完全是在浪费时间。但能被这么多优秀的作者说起的语言,肯定不是一个无名之辈吧,我尝试着去了解它。
随着了解的越深,我越发现它的有趣性,但由于国内的资料少,便找来国外的资料教程学习,并翻译出来。发布在了RubyChina上(这是我们目前看到的国内最好的语言社区)。而随着这一路的探索,我也发现了很多意料之外的领域和知识。随着我在社区的活跃,也让很多人看到了我的文章。其中一位就是西安一家公司的大佬,邀请我去他们公司看看 ...
加密算法的演化过程
加密算法的演化过程阶段1(明文):A 和 B在网上聊天,但是双方完全使用明文的方式传输信息,那如果有一天,A问B要游戏账号和密码,B发送了过来,这时候信息一旦被第三个看到,信息直接泄露。
阶段2(对称加密):A 和 B商量一下,以后咱们说话,先通过一个工具加密一下,比如每个字母往后3位,等你收到了信息,再利用工具,把每个字母往前3位,这样就保证信息即便被人看到了,也不知道说什么这个也叫对称加密,即加密和解密来自于一个秘钥。但这里仍有个问题,这个加密解密方法(秘钥)怎么安全让对方知道,别人都知道咱们是怎么加密解密的了,那即使发送的加密信息也没用啊,除非A跑到B他们家,给出秘钥。但全球范围内的通讯,不能这么搞吧。
阶段3(非对称加密):A 和 B又发现了新方法,咱俩一人创建一个公钥和私钥,然后交换对方的公钥,这个公钥即使被人看到了也无所谓,当你要给我发消息时,你用我的公钥进行加密,然后发给我,我在我这里用自己的私钥再解密即可,这样私钥只在我一个人手上,就不担心信息泄露了。这也叫做非对称加密但是用了一段时间后,A和B都感觉和对称加密比起来,非对称加密太慢了,已经严重影响沟通了啊。
阶段4(加 ...
TDD In SpringBoot
参考资料:
文章讲解TDD
视频讲解TDD
测试驱动开发在项目中的实践
TDD的概述代码示例说明这里我根据github的代码,进行简要的说明和讲解,最后我们会自己来写一遍测试。从接口层开始编写测试,从上至下,从接口到数据访问的顺序编写测试Controller层测试@WebMvcTest(controllers = PokemonController.class)
@AutoConfigureMockMvc(addFilters = false)
@ExtendWith(MockitoExtension.class)
public class PokemonControllerTests {
@Autowired
private MockMvc mockMvc;
@MockBean
private PokemonService pokemonService;
@Autowired
private ObjectMapper objectMapper;
}
mockMvc:用来模拟HTTP请求
objectMa ...
2023年度总结
2023年度总结成长二月份入职后,整个生活节奏快了很多,最初是先熟悉公司的系统框架,然后是梳理公司的业务流程,封装一些第三方的接口,后来领导看我熟练后,开始将一些简单的新业务让我来设计去做,我觉得这也算是小型公司锻炼人的一点,因为什么都要做,人员就那么几个,只要自己能力够,很快就能接触核心业务,而业务范围并不会太广。
这期间当然也犯了很多错误,不论是写新的业务还是维护老的代码,感谢领导和老板对我的包容,也因此让我对代码产生敬畏心,有一个好的代码规范十分重要,这体现在各个角落中:命名约定,条件判断,异常处理,代码组织方式上。这是我们在学习时最基本的课程,却也是工作中最重要的一部分,当维护一个有八百行的函数时,改哪里都是心惊肉跳的,每次上线都在心中默默祈祷千万别出问题。
今年没有花太多时间去学那些高大上的技术,因为完全用不到,也越发感受到不要过早将事情复杂化。主要精力还是集中在编写好的代码上,直到现在我才渐渐有意识的使用面向对象思想,其中两点让我印象深刻:异常处理,职责划分。
比如在看代码时,我们都不希望行数过多,因为这代表代码的职责也就越多,往往希望一个函数只做一件事。当函数在做处理并需 ...
面向对象的演化过程和解决问题
面向对象的演化过程和解决问题
前言:
相信大家对面向对象这个概念已经很熟悉了,如果你是使用Java入门编程的,一定会被大量灌输:类,继承,多态的概念,但我们真的理解它们吗?一切就好像自然而然,写代码不就应该是这样吗?但事实上这些概念,只是我们脑海中的一个毫无意义的符号,当我们写一个类时,我们只是按照被教导的方式编写。好比现在最多的Web开发,业务是用户的增删改查,我们想到用户会有:name,age,gender属性。于是我们创建一个实体:
class User {
String name;
Integer age;
Integer gender;
}
然后按部就班的写出Mapper(或Dao)层,Service层,Controller层,这就是MVC结构,它是如此的好用,让我们编写简单业务时十分顺手。但是当业务逐渐复杂时,我们在Service,Controller层中添加了大量的外部依赖,各种依赖注入,大量重复的代码堆砌在各个角落,一个变量被各个函数引用修改,当出现问题时,我们不得不到各个函数中查看,到底哪里出了问题,面向对象中的概念已抛到脑后。而且 ...
Effective Ruby
熟悉Ruby第一条:ruby中的True与False
在Ruby中,除了false和nil,其他值都为true,包括数字0
true和false并不是关键字,而是一个全局常量但不遵守命名规范和赋值规范
不遵守命名规范是因为,它没有以$开头
不遵守赋值规范是因为,无法写ture = something
true.class => TrueClass
false.class => FalseClass
既然不是关键字,true和false就有着对象方法
如false和nil都代表 false,那我们怎么进行区分?
这一点在表示配置信息对象中会贯穿始终,因为false一般代表禁用,nil代表未赋值,使用默认值等。
最简单的方式是 obj.nil? 判断是否为nil
还可以使用 false == obj 来进行判断,在一般常规语言中,我们倾向于把不变量放到左边,但这里我们有着功能性上的考虑,因为false是一个对象,而FalseClass定义了==方法,也就是说这里实际执行为 false.==(obj)。这也太牛逼了。比如一个类也定义了==方法,则可能就会出现混乱的样子,比如 ...
前端问题解惑
前端问题解惑 如今前端发展的太快了,让我们这些只会基础HTML + CSS + JS的人无所适从,大量的组件,大量的工具,让人不知道到底干嘛的,所以这里写下最近的学习所得,强烈推荐资源:theodinproject 和 modern-javascript-explained-for-dinosaurs。
前后端渲染后端渲染 如果你用过Java编写过Web项目,应该听说过Servlet 和 JSP这玩意儿,Servlet可以处理HTTP请求并生成响应,JSP是简化版的Servlet,用户通过访问Servlet,获取服务端的HTML页面,通过JSP可以在HTML中嵌入Java的代码,比如条件判断,循环,数据访问等等,增强页面展示和动态性。你可能会疑惑,为什么那时候不用Js啊,因为那时候的Js只能做一些简单的动态效果,表单验证之类的功能。
一切看起来不错,但有一些问题存在:
占用服务器资源多,所有计算在服务器完成。
每请求一次,都要从服务器上获取完整的HTML,比如我就想更新页面上一小部分,却需要下载整个页面(这里就引出了后面的ajax)。
...
如何测试驱动开发
前言
最近在读《匠艺整洁之道-程序员的职业修养》这本书,作者鲍勃大叔开篇就用了大量的示例来讨论与演示为什么需要和如何操作测试驱动开发。我是之前写过测试,但从不知道测试如何驱动开发,大部分情况下也只是先写生产代码,写好后再测试,看看是否能调通,再修改代码中隐藏的问题。 而测试驱动开发会扭转这种思维方式,是先写测试,再写对应的生产代码。这一开始让人会觉得很奇怪,感觉并且很麻烦,但当你尝试一下,就会发现这事儿挺有趣,且神奇。 温馨提示:Clean Craftsmanship: Disciplines, Standards, and Ethics (Companion Videos),这个是该书示例操作的视频说明,非常非常非常有用!!! 第一篇是讲述如何通过测试驱动开发来写一个栈结构。我严重怀疑大叔是不是一边写代码一边喝啤酒。整个过程伴随大叔魔性的笑声和宛如魔法般的操作,就好像他在不停调戏编译器。你会通过这个视频感受到如何从零开始,进行测试驱动开发。 下面将讲讲一些基础知识。
为什么需要测试驱动开发?
就我目前的现状,我能感受到重构代码时的痛 ...
发布自己的GEM
生成基础文件结构bundler gem your_gem创建一个基础文件结构第一次使用时,需要配置一些默认值:
测试Creating gem 'demo_gem'...
Do you want to generate tests with your gem?
Future `bundle gem` calls will use your choice. This setting can be changed anytime with `bundle config gem.test`.
Enter a test framework. rspec/minitest/test-unit/(none)
CIDo you want to set up continuous integration for your gem? Supported services:
* CircleCI: https://circleci.com/
* GitHub Actions: https://github.com/features/actions
* GitLab CI: https: ...
RubyConf China所想
时隔三年Ruby China大会在上海再次举行,也趁着这个机会去上海逛了两天,收获许多。
Ruby在如今中国已经是一个非常小众的语言了,大家都在争先恐后的学习:
Java
Go
Python
我能想到的原因就是大部分的公司在用这些语言,大部分人在用这些语言,如果这时候你选择学习一门小众且岗位极少的语言,也就意味着你在偏离"主流",在浪费时间。当你进入一家使用小众语言的公司,你也会担心这是否会影响今后长远的发展。而当你顺应追随"主流"时,你会想我选择了一个最保险的选择,公司都在招聘它。而当所有人都这么想时,主流中便涌入大量的人力,尤其是在中国。而数量的上升,与岗位的减少,让大家只能提高自己的质量,或想想其他出路。
而主流的人越多,支流的人也就越少,小众语言的公司负责人也会因为招人难而担心后续的发展,进而选择技术转型,甚至是在最初决策时,就转向使用人数最多的语言,而不是最适合场景的语言。这也就导致了一个恶性循环,最终主流上的人更多,支流上的人更少。
在我最初学习Ruby时,是因为看了《码农翻身》《程序员修炼之道》时,作者都在提及这个优雅的语言,让 ...