谈谈一个程序员本该具备的素质

前言

  去年的这个时候,我正值大四上学期末,忙于找工作,10月份11月份就开始在某些招聘网站上投简历,但是面试了几家,都直接回绝了,原因很简单,很多直接说不要没有经验的应届生,但是笔者在投的时候其实是筛选过的,基本投的都是没有经验要求以及实习生岗位,基本上一轮pass了,但是也让我看清了现实,就是社招如果没有经验,除非特别优秀,不然公司是不会花时间去培养的。后面去了校招,校招就太多经验要求了,基本上就是纯技术的竞争了,说实话,那个时候技术竞争我是毫无优势的,论计算机基础,我的功底非常薄弱,论java基础,熟悉的也就是常用的API,但是涉及到源码,实现原理,JVM等部分就不能应对了,还有多线程以及网络编程这一块也不够深入。幸运的是,校招看中的第一家公司录用了自己,现在想想也是缘分啊,投了六家,还有一家人事也通知我过去上班了,我权衡了一下,回绝了,选择了第一家更大的公司。

面试总结

  实习前到毕业那段时间,大概面试了十多家公司。笔者现在仅能凭记忆总结一下当初面试问过的问题以及一些笔试题。有些问题比较深刻,很多记不清了。简单罗列一下。

面试
  • 你能说说Mybatis与Hibernate的区别吗?
  • 说说你对Spring的认识?AOP的底层原理?
  • Servlet的生命周期?
  • 谈谈线程的生命周期?
  • 什么情况下线程不安全?如何解决安全问题?
  • 简单说说HashMap的底层实现?
  • 我看你的商城项目中有支付功能,用的是第三方的支付接口吗?
  • 你在项目中遇到过的最大困难是什么?
  • 你用过Nginx是吧,讲讲Nginx是怎么实现反向代理,负载均衡的呢?
  • 用过Redis吗?用过压测工具吗?知道Linux如何查看系统的负载吗?了解过缓存穿透,缓存雪崩,缓存击穿吗?知道如何优化sql吗?讲讲你之前的项目数据库索引使用的具体业务场景(一看就是互联网公司,用的技术都比较新,注重系统性能,用户体验)
笔试
  • 给定一个场景,设计表结构以及关联关系,书写相关的sql
  • 二叉树的前序遍历,中序遍历,后序遍历,层序遍历。或者选择题根据前中遍历结果,推导出后序遍历。
  • 冒泡算法(比较常考)
  • 转发与重定向的区别?
  • volidate的作用?
  • 列出十多个异常,表述下面异常通常发生在什么情况下?
  • hashCode与equal的作用?

一个程序员本该具备的素质

  接下来才是我要说的重点,就是一个程序员本该具备的素质。说实话,对于我这种非科班又是自学的人来说,走了不少弯路。抓不住重点学,就会非常迷茫。弯路唯一的价值就是不断买教训,不断重新认识领悟。
计算机与科学技术这个专业中,有几门课程是非常重要的:

  • 计算机组成原理

  • 计算机操作系统

  • 计算机网络(唯一学过的)

  • 数据结构与算法

  • 编译原理

  • 离散数学

      个人认为前面四项是重点。然后掌握一门编程语言,这就是一个程序员的本该具备的素质。
      万丈高楼平地起,再好的技术实现都逃不过这些底层的东西。以前经常吐槽大学教的东西是没有用的,别的专业我不敢说,但是对于IT这一行来说,计算机课程是非常有用的。可是这种重要性我们在大学里是体会不到的,为什么呢?第一,大学教的纯理论,真正实践的机会很少,当然没有真切的体会。第二,这些课程非常枯燥,能够沉下心来学好的人不多。第三,大学老师大部分教学一套PPT用几年,教学模式固定化,也不能结合实践讲出太多趣味性的东西。当然啦,教学只是辅助,学好必须得靠自己。
      即便是科班的学生,真正学好这些课程的人其实并不多,所以一个程序员本应该具备的素质许多人也不能达到。笔者自己更是不具备这种素质。当然啦,这并不影响我们完成基本的开发任务,并不影响完成增删改查。那为什么我还要强调这些素质呢?
      靠技术吃饭的人,多多少少都会有危机意识,技术更新那么快,如何让自己多年后依旧屹立不倒,那就是这些底层的东西,如果不利用业余时间弥补底层的东西,可能过不了两三年就会遇到瓶颈。当然,学习是有时间成本的,你只能慢慢去弥补这些知识领域,保持学习,量变终究会质变。那个时候,你会站在另一个新的高度。

我的书籍推荐

  除了上面的课程对应书籍外,我下面推荐主要是java程序员的看的书籍:

  • 《Java编程思想》
  • 《阿里巴巴Java开发手册》
  • 《深入理解Java虚拟机 JVM高级特性与最佳实践》
  • 《图解TCP_IP》
  • 《图解HTTP》
  • 《Java并发编程的艺术》
  • 《Netty实战》
  • 《Spring实战》
  • 《Redis实战》
  • 《设计模式》
  • 《Spring Cloud微服务实战》
  • 《鸟哥的Linux私房菜》
  • 《MySQL技术内幕》
      
      其实,官方文档以及源码也是很好的教材。另外,其实看视频也是很好的学习方式,可以下载一些分布式微服务架构的课程来看,笔者自己买了几套视频,知识付费时代,想学点真东西还是得出钱啊,当然啦,现在很多公众号会很良心的免费提供一些资源。市面上公开的资源大多是基础的课程,如果想深入,那就得去买一些中高阶的课程。

我常去的网站社区

  • GitHub(全球最大的同性交流网站,这是程序员必须上的网站,里面开源项目特别多)

  • CSDN

  • 知乎

  • 博客园

  • SegmentFault

  • 慕课网

  • 掘金

  • 伯乐在线

      当然,除了这些网站之外还有一些其他一些网站,因为不太主流,就不作推荐了。
      最近笔者在掘金发表了一篇文章:多线程并发篇——三件兵器

https://juejin.im/post/5bfcb99cf265da613e21edd5

  让我意外的是这篇文章获得了一千多的阅读量,而且发表不久就登上了后端热门栏目,真的是有点惊喜。

这一年,我学到了什么?

  工作一年,我在公司学到了什么呢?
  实习的时候,进入了研发部门,项目经理刚开始并没有安排项目,只是让我们研究一下单点登陆系统以及权限系统,那个时候其实是最头疼的,一个工程那么多代码,不知道从何看起,也不知道怎么跟其他系统进行对接。后面,终于可以开始参与一个项目,设计表结构的时候还用了外键约束,其实外键会影响数据库性能,最好在程序中自行维护表的关联关系。那个时候,复杂的子查询不会写,不懂添加索引,maven不太会用,SVN不熟悉,写的代码不规范,Linux命令不熟悉,不会部署应用,这些东西其实都是在项目中才真正熟悉起来的。说实话,我的代码水平可能更多的是在课外提高的,但是对于业务流程以及开发的各种开发工具是在项目中提高上来的。写小程序服务接口的时候,经常要测试接口,才学会了Postman这个工具。包括与前端对接的时候由于写的接口文档不清晰,经常把时间浪费在讨论接口的字段含义上。
  大四下学期中期,我被调到了别的项目组,参与政府部门的项目。由于之前写的是后端代码,来到这个项目组却写了前端,就觉得自己是不是偏离轨道了。还好刚开始项目组的技术负责人并没有安排什么任务给我,只是让我熟悉一下这个项目组的项目,然后学学angularjs,说是学,但是由于没什么任务,上班效率并不是太高,本身自己JavaScript就不太好,也没怎么深入去学过,angularjs更是不懂,只是跟着网上的教程看看,敲一些简单的代码。后面新需求来了,没办法了,安排我做一个模块,只能硬着头皮做了,还好有之前一些样例可以参考,那就一顿复制黏贴,根据需求改一改代码,然后不断测试调试代码,虽然不知道怎么来的,但终归实现了功能,就这样,在不断的复制黏贴修改代码中,我慢慢了解的angularjs,也大概懂得怎么去用。这期间,我学会了前端代码的调试,对JavaScript也熟悉了不少,写sql的能力也有了一定的进步,因为有些时候需要些一些复杂的sql,特殊情况,需要写数据库的存储过程和函数实现。
  当然,对于后端的学习,只能工作之余学了。

最后

  笔者当初误打误撞走进了IT,只希望热爱工作,热爱学习,做好自己手头的每一件事,内心里不乐意加班(庆幸现在没怎么加班,希望以后即使加班都在自己能接受的范围),希望保留一份生活的空间。感谢大家的支持!!

转载于:https://juejin.im/post/5c1481926fb9a049ff4e0440

### 回答1: 优秀的程序员应该具备以下知识: - 熟练掌握至少一种编程语言,并能灵活运用 - 熟悉常用的算法和数据结构 - 理解计算机系统的工作原理和底层技术 - 熟悉软件工程的基本原理和实践 - 拥有良好的问题解决能力和代码组织能力 - 具有良好的沟通能力和团队协作精神 - 对新技术和发展趋势有兴趣并能够不断学习和提高. ### 回答2: 一个优秀的程序员应该具备以下几方面的知识。 首先,他应该具备良好的计算机基础知识。这包括了操作系统、数据结构与算法、计算机网络、数据库等方面的内容。这些基础知识能够帮助他更好地理解程序运行的原理,并能够在编写代码时作出更优化的选择。 其次,一个优秀的程序员应该对编程语言有深入的了解。他应该熟悉至少一种常用的编程语言,并对其语法、特性和使用方法能够熟练掌握。此外,他还应该具备学习新语言的能力,以适应不同项目的需要。 此外,一个优秀的程序员还应该具备系统分析和设计的能力。他应该能够根据项目需求进行系统分析,将需求转化为具体的软件设计,并编写出高质量的代码。他还应该了解软件开发中的常用设计模式和架构思想,以确保程序具有良好的可扩展性和可维护性。 除了技术知识,一个优秀的程序员还应该具备良好的沟通和团队合作能力。在项目中,他需要与其他开发者、测试人员和用户进行有效的沟通,并能够在团队中发挥积极的作用。 最后,一个优秀的程序员应该具备持续学习的意识。由于科技的不断发展,编程领域的知识也在不断更新。一个优秀的程序员应该保持学习的热情,并不断跟进新技术和新发展,以保持自己的竞争力。只有不断学习,才能在日益激烈的竞争中保持领先地位。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值