昨天第一次投出了简历,目标腾讯,可能最近就要开始面试了,所以对个人的项目经历及获奖经历进行一个整理

总体结构

深信服安全邮箱APP开发

项目简介

一个与深信服公司合作的开发项目,我们这边负责整个邮箱APP的开发,深信服公司负责给APP加上一层安全系统。我主要负责的是底层开发,用的是C++,但其实那时候是第一次接触面向对象语言,自己比较菜,所以做的是边缘一点的模块,最后在语言方面其实并没有学到多少。在这个项目里面更多的是学到了企业级项目的管理与沟通,以及接触到了代码规范,团队开发中的代码管理,接触到了一些简单的设计模式,测试驱动开发,以及了解到了当时看到学长们在做的一些并发程序设计。

总而言之在这个项目里,我自己coding能力并没有很显著的提升,但自己这种稍微大一点的工程有了更强的把握能力,在这个项目里学到的这些在我之后领导小组做网站开发的时候都有用到。

涉及的知识点

  • 项目管理与沟通
    • 每日站会、日报周报、996
    • 架构>开发、前后端沟通:API文档(引申到自己领导小组进行网站开发)
  • 代码规范
    • 函数/类名驼峰式命名,变量下划线命名
    • 局部变量、私有变量加前缀等等
  • 代码管理(Git)
    • 深信服自己搭建gitlab/网安项目组用svn
    • 静态审查
  • 设计模式
  • 测试驱动开发(TDD)
  • 并发程序设计

启亦伏安表APP开发

项目简介

这个项目能说的就不多了,这是和武汉启亦电子有限公司合作的一个软硬结合的项目,目的是做一个能在他们专用的pad上运行三相电流伏安表,由于我在这个项目是临时抽调,待的时间不长,其中还有一个月出国交流了。在这个项目组的时间里主要就是Android入门,主要工作就做了一个Word报表的生成,这个就比较有意思了,这是我第一次以一个程序员的角度去看待我们常用的Word这个工具,当时其实还挺惊讶,原来word文档的组织结构跟一个网页是相似的。

涉及的知识点

  • Android开发(现在不会了)
  • Java操作Word

网络安全系统构建

项目简介

从大三上到现在我就一直都在一个做网络安全的项目组,这个项目是一个研究型的项目,他是一个国家级项目的子课题,我们主要是要构建一套流量的检测与防御系统,还有其他子课题在研究如何去攻击,两边互为矛盾,互相砥砺。我在这个项目中主要做的是逆向工程,比较底层,平时主要接触的是汇编和C,但其实在这个项目组基本就没怎么写过代码,主要以调研与分析为主。在这个项目组里面有意思的工作也不太多,emmm,可能有意思一点的就在于一开始学PE的时候做了一个新人任务,如何用最小的空间去完成一个helloworld程序,当时主要用到方法是裁剪资源表以及利用Dos头里的空间等,以及还考虑过去做字节压缩,但最后没写出来。然后平时的工作有时还会涉及到部分计算机网络的知识。

涉及的知识点

  • 逆向工程
  • PE文件
  • 一些骚操作(HelloWorld裁剪)
  • 计算机网络

华中赛数模——库存补单及销量预测

  • 时间序列分解

求是杯——鸭梨管家心理压力检测仪

  • 项目原理

网站搭建

  • express+vue
  • 跨域问题

自我介绍初稿

面试官你好,我是来自华中科技大学Dian团队的一名17级本科生,我叫刘羿,目前就读于电子信息与通信工程学院,基于项目的信息类专业教育实验班,我的意向岗位是后台开发。在这里我就先简单介绍一下我在大学三年的时间里的一些项目经历以及获奖经历,以便面试官对我有一个初步的了解。

我在大一下参与了与深信服公司合作的安全邮箱APP的开发,在这个项目组我们团队这边负责整个邮箱APP的开发,深信服公司负责给APP加上一层安全系统。在这项目中我主要负责的是底层开发,用的是C++,但其实那时候是第一次接触面向对象语言,自己比较菜,所以做的是边缘一点的模块,最后在语言方面其实并没有学到多少。在这个项目里面更多的是学到了企业级项目的管理与沟通,以及接触到了代码规范,团队开发中的代码管理,接触到了一些简单的设计模式,测试驱动开发,以及了解到了当时看到学长们在做的一些并发程序设计。

总而言之在这个项目里,我自己coding能力并没有很显著的提升,但自己这种稍微大一点的工程有了更强的把握能力,在这个项目里学到的这些在我之后领导小组做网站开发的时候都有用到。

这个是我大一下到大二上做的一个项目,在大二下就没有做项目了,主要是参加了几个比赛,这个我待会再讲。大三上的时候参与了启亦伏安表APP开发,这个项目能说的其实并不多,这是和武汉启亦电子有限公司合作的一个软硬结合的项目,目的是做一个能在他们专用的pad上运行三相电流伏安表,由于我在这个项目是临时抽调,待的时间不长,其中还有一个月出国交流了。在这个项目组的时间里主要就是Android入门,主要工作就做了一个Word报表的生成,这个就还比较有意思,这是我第一次以一个程序员的角度去看待我们常用的Word这个工具,当时其实还挺惊讶,原来word文档的组织结构跟一个网页是相似的。

从大三上到现在我就一直都在一个做网络安全的项目组,这个项目是一个研究型的项目,他是一个国家级项目的子课题,我们主要是要构建一套流量的检测与防御系统,还有其他子课题在研究如何去攻击,两边互为矛盾,互相砥砺。我在这个项目中主要做的是逆向工程,比较底层,平时主要接触的是汇编和C,但其实在这个项目组基本就没怎么写过代码,主要以调研与分析为主。在这个项目组里面有意思的工作也不太多,emmm,可能有意思一点的就在于一开始学PE的时候做了一个新人任务,如何用最小的空间去完成一个helloworld程序,当时主要用到方法是裁剪资源表以及利用Dos头里的空间等,以及还考虑过去做字节压缩,但最后没写出来。然后平时的工作有时还会涉及到部分计算机网络的知识。

接下来我说一下获奖的经历吧,主要就是两个奖项,一个是华中赛的数模,做的是一个库存补单及销量预测的一个模型,一开始拿到这个这个题目就考虑用机器学习去做,但最后效果不是很好,毕竟我们也不是专业做AI的,后来是做了一个基于统计的模型,用的时间序列的分解,把一个销量的模型按季节性、商业活动、新品上市等方面去做拆分,最后给商家设计了一套进货的策略模型,在这个比赛中是拿了一等奖。

还有一个是求是杯,这是一个创新创业的比赛,我们的项目是一个实验室的课题,做的是一款心理压力检测仪叫鸭梨管家,他的原理主要是人在压力大的时候唾液里的一种酶会增多,然后有一种检测试纸可以检测浓度,当时我是和一个学长一起做对试纸的图像分析,我负责软件方面,主要做了一些图像识别的工作,后来还加上了CNN去预测心理压力纠正数据误差,但其实这个效果也不好去评判。最后这个项目拿了一个三等奖。

除了这些项目和参赛的经历之外,我也做了不少学生工作,担任过电信学院的科协主席,也是在这个时候带着学弟学妹去做过一些网站,比如学院的选课网站啊,以及学生会的招新网站等,这个在前面也提到过,用的主要是nodejs的express框架,比较基础,数据库都用的mongodb,对其数据库只是了解,并不太熟。

我自己在平时也会做一些也会做一些便利工作与生活的一些小玩意,比如学Android的时候写过一个火锅计时器,在整博客的时候写过一个自动同步有道云笔记到Hexo博客的PC端程序,还有什么自动评教脚本这些等等,但对于这些技术其实也没有太深刻的理解,做的时候都是秉承着能用就行的原则,技术为需求服务。

这大概就是我本科阶段的一些经历,整体说起来其实做得很杂,什么都接触过,但感觉什么都不精通,所以可能很多细节原理部分自己都是一知半解的,但个人感觉在接受新知识的方面应该是比一般同学要强一点,毕竟啥都接触过一点,可能就这么点优势。我的自我介绍大概就这么多,面试官有没有什么问题我们再来探讨。


详细知识点整理

git与svn区别

  • git是分布式的,svn是集中式的
  • git能具体定位到元数据,而svn则是按文件进行管理
  • svn的分支就只是另一个文件夹,git的才是真分支
  • git的主分支和其他分支没有本质差别,svn的其他分支都是基于某一个主分支进行管理的

测试驱动开发(TDD)

  • 先写单元测试再开始写代码
  • 注意输入参数合法性校验以及边界值检测
  • g_test框架

Word文档结构

  • XML

跨域问题及解决

  • 问题产生缘由:浏览器的同源策略
  • 同源策略缘由:保障浏览器安全
    • CSRF攻击(Cross-site request forgery)跨站请求伪造
  • 解决方案:CORS(跨资源共享)-> 修改Header信息

知识点整理集合

Linux&编译原理

操作系统

数据库

计算机网络

编程语言

面经List

阿里云实习生

腾讯实习生

深入交流的point

并发程序设计案例

记忆中比较深刻的一次开发经历是我在深信服组做底层开发的时候,当时我写的是配置模块,就是一些设置项,这些是存储在本地的,因为数据量不大,所以当时是用的文件读写的方式进行存储的。一般的配置项其实对并发要求并不高,但当时在配置模块中还存储了自动回复的消息,每次自动回复的时候都会进行访问,所以有一定的并发性。

当时第一次写完程序的时候,高并发测试一直过不去,我自己就先自查嘛,尝试计了一下时,发现大部分的时间花在了文件读写上,在数据处理上花的时间不太多,所以当时就去询问项目经理怎么办,我们的项目经理是深信服公司过来的带着我们做的一个架构师,他当时告诉我说可以用缓存来解决高并发的问题,让我自己去网上查一下。然后我就自己尝试着写了一个缓存的模型,大概就是每次启动APP的时候我就把自动回复的信息读取到内存中,每次写入的时候就更新缓存再异步写入到文件里。

对于这个缓存模型一开始我是用单例模式来实现的,一开始不熟悉单例模式自己一边百度一边写出了一个懒汉模式,但在测试过程数据时不时会出现一些问题,查了很久才发现是因为我实现的这个类线程不安全,可能会造成有多个对象被创建,最后是用双重锁检查机制来解决的这个问题,也就是在加锁之前后各检查一次对象是否存在。

整个过程其实挺曲折的,我在写这个的时候也让项目经理废了不少心,毕竟当时才大一,很多东西不懂,我记得我当时每次很快就写好了代码然后兴冲冲地提交,每次审代码的时候又会被驳回并被教育一次,在这个过程中虽然做的不是很复杂,最后看来也就是一个缓存机制加一个锁的机制,但整个过程下来就理解了为什么要这么做,让我很印象深刻。

  • Q:为什么要用双重锁机制进行两次检验呢,一次不可以吗?
  • A:理论上来说一次检验也是可以的,但如果没有第一次的instance的检测,那么在后续获取单例的时候,如果是多个线程同时访问的话就会在synchronized排队,这个时候实际上是不需要同步的,所以才会引入双重锁机制。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class Singleton {  
    private:
    static Singleton* m_instance;
    Singleton(){}
    public:
    static Singleton* getInstance();
    };

    Singleton* Singleton::getInstance()
    {
    if(NULL == m_instance)
    {
    Lock();
    if(NULL == m_instance)
    {
    m_instance = new Singleton;
    }
    UnLock();
    }
    return m_instance;
    }
  • Q:常见的单例模式有哪些实现方法

  • A:主要有以下四种:
    • 饿汉式(在类加载的时候完成对象加载,线程安全)
    • 懒汉式(第一次使用的时候完成对象加载,线程不安全,可以加入单重/双重锁检查机制)
    • 静态内部类(线程安全)
    • 枚举(线程安全)

一台主机不能设置两个网关

在网安组记忆比较深刻的是我们在做恶意软件复现的时候搭建了一个攻防平台,要求是两个内网中间用一个交换机连接。当时交换机有其他小组在用,所以我们就用了一台双网卡的机器来当做交换机,配置防火墙和抓包也方便。

但遇到了一个问题是内外网ping不同,于是就开始排查,找了很久发现没什么问题,觉得每一个网段都没问题,应该是在充当交换机的机器这卡住了。后来看到ping的输出是目标主机不可达,这就很奇怪,因为一般网络不通会请求超时,所以我们判断应该是网关有问题,可能是防火墙设置的问题,没有把数据包转发出去。

后来发现是这台机器上的两个网卡都设置了网关,同一台机器或者路由器上的两个网口是可以互相通信的,所以内网网口是不需要设置网关的,只需要对外的网口设置网关即可,如果两个网口都设置了网关,路由器就不知道数据包往哪发了,所以就返回了目标主机不可达。

从这次经历中我们也明白了理论知识对于实践的重要性。