草庐IT

我的十年编程路 2020年篇

编程二三事 2023-03-28 原文

我出生在1990年,2020年到来的时候,我完成了一项成就:奔三。同时,也开启了新的征程:奔四。

2020年的春节是在广州的丈母娘家度过的,春节后大概是初五,或者是初六,我和媳妇就返回天津的家了。

那个时候,大家应该都有印象,疫情刚刚爆发,全国在封高速路。本来想开车回去的,结果怕有风险,还是选择了飞机,车是托运回去的。

我记得当时坐飞机的时候,整个飞机的人简直少得可怜。回到家,便开始隔离,随后封小区,马路上的行人越来越少了。

刚回家的时候,我们身处的行政区还没有阳性病例,但已经完全被其它沦陷的行政区包围。虽说有点“独善其身”的感觉,但说到底还是“瑟瑟发抖”。

二月份的时候还下了大雪,我和老婆还出去玩雪。无论怎样也想不到这次疫情会持续三年之久,那个时候的我们,还很天真地以为再过几个月,就能恢复如常。

从那个时候开始,就业市场便开始变得很不景气。我特意翻看了当时的邮件,标题从一开始的“抗击疫情”,到“远程办公”,再到“跳槽困难模式”,越来越妥协。

这段时间过得其实蛮轻松的,一方面在家和老婆一起过一日三餐的生活,偶尔还会一起对弈下棋,很幸福;另一方面,就是我的书稿《打造流畅的Android App》,在3月底的时候交付了。计划是4月底交付,由于举家搬迁,处于离职状态,所以加快了速度,真是世事难料。

在居家的时候,我们整理了家里的各种事物。无意间,我发现了早在2010年写的,寄给未来10年的信。这封信需要在2020年打开,也就是现在。不过,我早就忘了写了什么,甚至都忘了还写过这个东西,于是二话没说,就打开了。信里写的愿望,简单地说就是成家,不是大富大贵也没关系,但求温馨。这样的愿望现在看上去其实蛮幼稚的,有句话叫做:“贫贱夫妻百事哀”,没有经济基础的家庭其实应该会很艰难,所以温馨的前提是经济上还过得去。好在当时的状态,还真就是不用太为经济担忧,家里挺和谐,挺温馨。所以,这个愿望也算是实现了吧。

其实现在想想,我的愿望一个接一个地都实现了,会不会是愿望本身就定的太过轻松了?

话说回来,一直没有收入总归不是很好。没过多久,我就联系了之前一起搞阿里同城会的老板,见面聊了两次,当时觉得很投机,于是便决定加入公司,一起共事。那个时候大概是4月份的事情了。这段工作经历教会了我很多事,先说说技术上的。

虽然之前我写过Flutter的书,但毕竟是入门级别,况且我也没有什么实战经验。在这家公司开发的第一个软件就是使用Flutter技术构建的。不得不说,做客户端习惯了,到了Flutter,确实需要一些前端开发的思想,必要时需要转换一下。更值得一提的是,在开发过程中,我还发现用到的一些开源库存在缺陷。于是在Github上贡献了两次,解决的都是空指针的问题。

其实,从着手写Flutter App到熟练,再到贡献开源事业,整个过程不过1-2个月。除了Flutter技术本身好上手,开发效率高之外,还有一个原因,就是写代码多了之后,上手类似的新技术其实是很快的事情,正所谓熟能生巧。

随着开发过程的推进,我继续将心得总结下来,发表到CSDN上。这些博客文章不仅限Flutter,还有阿里云移动研发平台的探索。另外还做了一次视频录播分享,直播答疑。但毕竟是第一次,做得乱七八糟,很狼狈。不过这也为下一次直播的成功打下了基础,就是2022年的Go语言图书发布直播,再后面我再详细说这段体验。

此外,在做工作总结的时候,我的前辈不留情面地指出了我在表达上的欠缺,我至今非常感谢他。像SMART原则,其实我之前或多或少听说过,甚至了解过,但在实战中却没有用上。究其原因,我觉得一直以来,我的工作就是上级安排什么,我就做什么。缺乏明确的自主性和目标感。再有就是陈述事情的时候,要充分考虑到受众群体,不要自说自话,做“自嗨”式发言。

就在今年(2023),我两次作为导师参加了公司的新人入职答辩。过程中,我也发现其实很多人在做试用期的工作总结时,都忽略了上述这些原则,导致与会人听得云里雾里。于是在结束后我也给出了类似的建议。

作为软件工程师,和计算机打交道的时间可能比和人打交道的时间多,再加上技术本身的特性。使我们慢慢变得不善与人沟通。但生活在这个世界,与人打交道终究是无法避开的。若要获得陌生人认可,就必须要掌握表达、沟通的技巧。所以,我劝大家,学习技术本身重要,但不要忽视与人沟通的能力。

这段工作没有持续太长时间,我就离职了。快到年底的时候,我加入了一家依托于成熟上市公司的创业公司,做互联网医疗业务。虽然客户端我也在做,但其实用到的技术大部分是Flutter。另外就是前端页面,包括微信公众号,也由我来维护。这段工作经历,我在技术方面有了横向发展的机会。

哦,对了。前面提到的,我发表过的Flutter相关内容,先后被谷歌开发者公众号转载两次,2020年是第二次,好像是转载了B站的视频,主题是自定义组件。我也再一次获得了纪念品。嗯,还是Google的贴纸,似乎是多了一个Flutter吉祥物毛绒玩具。好像是这样的,获得纪念品的次数太多了,我实在是分不清哪一个是哪一次得到的了。

忘了是在2019年年底还是2020年年初,我还晋级了CSDN的2019年度博客之星年度总评选前200名。后来我发现同行的拉票手段实在是五花八门,我没有那个本事,于是最后的结果就定格在157名,总投票数是980。当然,这个票数是每人最多可以5票。所以最极限的情况下,有176个人给我投票,且每个人都投了5次。考虑到我并没有拉很多人给我投票,也没搞什么别的方式。所以我认为这176人是我忠实的读者和支持者,在这里再一次感谢你们的支持!

另外就是2020年,忘记了是上半年还是下半年,我参加了一次腾讯课堂的讲师大赛,最后获得了入围奖。

其实在2020年,我已经开始初步尝试做视频,而不是单纯产出图文内容。不过后来,在视频方面我没放太多精力,还是停留在图文内容的生产上,看来以后要多做做视频内容,哪怕是直播也可以。

说到图文,新书《深入浅出Android Jetpack》开始动工了,这一写,就到了年底。

回顾2020年初,我们一起和广州的好友攀登了白云山。虽然只有不到400米高,但登顶的感觉总归还是有的。

到了2020年末,我们再次一起观看了罗振宇的跨年演讲。这一年给我留下最深刻的印象是:“打造学习型家庭”。

没错,年过三十的我再次意识到学习的重要性。甚至开始羡慕那些大学生甚至中学生,如果再给我那么多时间,能再活一次,我愿意和过去的我说一声:“珍惜时间”。

有关我的十年编程路 2020年篇的更多相关文章

  1. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  2. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  3. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  4. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  5. Tomcat AJP 文件包含漏洞(CVE-2020-1938) - 2

    目录1.漏洞简介2、AJP13协议介绍Tomcat主要有两大功能:3.Tomcat远程文件包含漏洞分析4.漏洞复现 5、漏洞分析6.RCE实现的原理1.漏洞简介2020年2月20日,公开CNVD的漏洞公告中发现ApacheTomcat文件包含漏洞(CVE-2020-1938)。ApacheTomcat是Apache开源组织开发的用于处理HTTP服务的项目。ApacheTomcat服务器中被发现存在文件包含漏洞,攻击者可利用该漏洞读取或包含Tomcat上所有webapp目录下的任意文件。该漏洞是一个单独的文件包含漏洞,依赖于Tomcat的AJP(定向包协议)。AJP自身存在一定缺陷,导致存在可控

  6. ruby-on-rails - 测试我的 Ruby gem:Shoulda::Matchers:Module (NoMethodError) 的未定义方法 `configure' - 2

    我正在开发我的第一个Rubygem,并捆绑了cucumber、rspec和shoulda-matches进行测试。当我运行rspec时,出现以下错误:/app/my_gem/spec/spec_helper.rb:6:in`':undefinedmethod`configure'forShoulda::Matchers:Module(NoMethodError)这是我的gem规范:#my_gem.gemspec...Gem::Specification.newdo|spec|......spec.add_development_dependency"activemodel"spec.a

  7. ruby-on-rails - Heroku 吃掉了我的自定义 HTTP header - 2

    我正在使用Heroku(heroku.com)来部署我的Rails应用程序,并且正在构建一个iPhone客户端来与之交互。我的目的是将手机的唯一设备标识符作为HTTPheader传递给应用程序以进行身份​​验证。当我在本地测试时,我的header通过得很好,但在Heroku上它似乎去掉了我的自定义header。我用ruby​​脚本验证:url=URI.parse('http://#{myapp}.heroku.com/')#url=URI.parse('http://localhost:3000/')req=Net::HTTP::Post.new(url.path)#boguspara

  8. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  9. ruby-on-rails - rspec - 我怎样才能让 "pendings"有我的文本而不仅仅是 "No reason given" - 2

    我有这个代码:context"Visitingtheusers#indexpage."dobefore(:each){visitusers_path}subject{page}pending('iii'){shouldhave_no_css('table#users')}pending{shouldhavecontent('Youhavereachedthispageduetoapermissionic错误')}它会导致几个待处理,例如ManagingUsersGivenapractitionerloggedin.Visitingtheusers#indexpage.#Noreason

  10. ruby - 为什么 return 关键字会导致我的 'if block' 出现问题? - 2

    下面的代码工作正常:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson)do|key,oldv,newv|ifkey==:aoldvelsifkey==:bnewvelsekeyendendputskerson.inspect但是如果我在“ifblock”中添加return,我会得到一个错误:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson

随机推荐