V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
binbinyouliiii
V2EX  ›  Java

一个合格的 java 实习生技能树要点到什么程度

  •  
  •   binbinyouliiii · 2016-11-26 21:03:47 +08:00 · 14195 次点击
    这是一个创建于 2948 天前的主题,其中的信息可能已经有所发展或是发生改变。

      楼主是个 17 届专科应届生,今年大三了,同样需要出来找实习了,自认为算在班里学的还可以的,老师几乎没什么用,只能自学。
       6 月份的时候有个校招,专科学校的校招,来的企业要么是来抓你做苦力的,要么就是些跟学校或政府有关系的公司,要求都很低,我甚至见过 hr 问我的同学:“你知道 mvc 分别代表什么吗?”,同学回答完之后过两天还来了录用通知,然后苦 B 的在公司做测试(不是我贬低测试这个职业,真测试技术含量也不小,但是这些公司的测试极其没有技术含量,纯手工化测试,几乎是个懂点的人就能干)。还有某著名青岛家电企业来招测试,然后什么也不会的同学被录用去当电视测试。

      楼主那时候年幼无知,也有学校的规定的原因,然后楼主挑了几家还算靠谱的(其实招软件的一共也没几家),来了通知后又挑了一家比较“靠谱”的公司进去了,是那种跟政府关系好的然后接政府的活。
      干了几天后来觉得自己被学校卖了,工资 1500 不到(好像这是批发价,公司同样找来做测试的,技术水平和上面说的那位同学差不多的也是这个价),技术氛围很差,只能默默地自己在角落里默默学习。
      后来干了4个月,实习协议也到期了,打算辞掉去上海,也非常巧,正好赶上公司要裁人,于是我就这么被 Bang 掉了,裁掉也不是因为技术不够,也有各方面的原因。
      可是被踢掉心理总是不舒服,因为那位什么也不会的测试同学没被踢掉,自己有技术但是被踢掉了。心里有时候也安慰自己不是技术原因被踢掉的,可是总是觉得自己技术不够,想学习。看了很多 java 招聘的,看到要求需要会的很多,什么 redis , netty 的,最近学了学 redis ,基本会用了,但是一直找不到实践的地方,这就造成了死循环,想学习,但是找不到实践的地方,学不精,越不精,就越不敢找实习,怕碰到坑,所以今天想来问问找实习的话需要学到什么程度。

      现在的技能树,会 ssm 框架, ssh 框架也会,但是赶不上 ssm 框架熟悉,会简单的 redis (实践只在树莓派上用过), netty 正在看,但是确实不知道用在什么地方。
      网页方面,简单的 jquery 和 css 还是会的, linux 也会点,也有上线的网站。
    32 条回复    2016-12-15 18:35:27 +08:00
    tianzx
        1
    tianzx  
       2016-11-26 22:02:37 +08:00 via Android   ❤️ 1
    好好看算法🙄
    boyhailong
        2
    boyhailong  
       2016-11-26 22:33:59 +08:00   ❤️ 1
    java 后端?如果是后端,首先是操作系统,网络,数据结构这些基础, java 语法,如果是 web 开发,熟悉一些 web 框架吧。
    neoblackcap
        3
    neoblackcap  
       2016-11-26 22:36:24 +08:00   ❤️ 7
    刚好提了一个招聘的问题,那我就站在后端的角度说说了,毕竟楼主你是 Java ,按道理应该也是想干后端的吧。
    首先呢,一个应届生我们对他都是没什么来了就能干活的期望,我们只希望他来了之后能快速成长,然后再慢慢开干。同时切记用语言划分岗位,什么 C++程序员, Java 程序, PHP 程序员都是狗屁招聘。
    一门语言要了解它的语法然后干增删改查的活需要很久吗? 2 天可以了吧。所以语言划分工作都是渣,专注一个自己熟悉的领域才是正道,喜欢编程语言的就去学编程语言,学什么范畴论,喜欢分布式就应该去读 google 的分布式老三篇。

    以我们公司为例,我们招人要求后端基础扎实。
    需要会什么?请参考《 CSAPP 》。
    具体不外乎什么是系统调用,并发控制,锁,进程 /线程, IO 中的同步,异步,堵塞,非堵塞,最好的例子就是写一个可以支持并发连接数为 10 的 echo server
    等你学完了这些你去学什么框架都会很快的了,框架的学习要点不在于用,在于明白作者的思想,为什么要这样设计,然后你就可以用框架解决很多问题,以及会知道哪些问题框架解决不了要自己上。
    大三的还算早,我当年也是大三特意花时间去看《现代操作系统》感觉实在是获益良多,有时间多看机械工业出版社的大理石系列的书,你看完之后肯定会获益良多,之后你再花一个月时间写个 echo server 放在你自己的 github 上,我保证你肯定能有真正互联网企业愿意招你,完全可以忽视那些伪 IT 企业。
    echo1937
        4
    echo1937  
       2016-11-26 22:40:31 +08:00
    gogohigh
        5
    gogohigh  
       2016-11-26 22:43:17 +08:00
    apue,unp 这两本书加上一点 java se 基础就可以了
    depress
        6
    depress  
       2016-11-26 22:50:17 +08:00 via Android
    说句实话吧,在帝都,能用 ssi 或 spring mvc 搭个博客的,会 Linux 部署的, 12k 的工作能找到,多线程、反射、 nio 还比较熟,会一种 nosql 或内存数据库的, 15k 能找到,实际上我身边拿 15k 的人自己也搭不出一个博客, spring 用的也马马虎虎。然而我觉得对于应届生而言,算法是最重要的。
    q397064399
        7
    q397064399  
       2016-11-27 06:14:25 +08:00
    @neoblackcap
    echo server 并发为 10 貌似很 容易啊,
    原生的 select 以及 posix 线程 api 就能搞定
    q397064399
        8
    q397064399  
       2016-11-27 06:30:26 +08:00
    Java 最重要的就是
    反射 反射 反射 线程 线程 线程
    重要的事情提三遍,只要你吃透了反射 线程,各种框架基本上就是手到擒来,
    我以前不懂,吃了大亏,搞懂了反射 线程,你就可以去各种框架的源代码里面 大概摸一摸(不提倡细读代码)
    对你学习框架的使用有很大的帮助
    q397064399
        9
    q397064399  
       2016-11-27 06:32:28 +08:00
    另外学框架 最好找个培训班录好的视频看, JavaEE 历史太悠久,有很多暗坑,自己踩起来 特辛苦
    q397064399
        10
    q397064399  
       2016-11-27 06:35:55 +08:00
    @neoblackcap 这位仁兄要求并不高,本屌丝 菜鸟一枚 DNSProxy 初版代码,花了 2 天学习 Boost 的时间写的,

    #include "stdafx.h"
    #include <iostream>
    #include <boost/asio.hpp>
    #include <vector>
    #include <boost/thread.hpp>
    #include <boost/date_time.hpp>
    #include <boost/lambda/bind.hpp>
    #include <boost/lambda/lambda.hpp>
    using namespace std;
    using namespace boost::asio;

    int thread_count = 0;
    boost::mutex mu;


    void handle_request(ip::udp::endpoint & request_ep, vector<unsigned char> &buff, int bytes, ip::udp::socket *back_socket) {
    mu.lock();
    thread_count++;
    mu.unlock();
    io_service dns;
    ip::udp::endpoint dns_server_ep(ip::address::from_string("223.5.5.5"), 53);
    ip::udp::socket sock(dns, ip::udp::endpoint(ip::udp::v4(), 0));
    sock.send_to(buffer(buff, bytes), dns_server_ep);
    vector<unsigned char> data(2048, 0);

    int nativeSocket = sock.native();
    fd_set fileDescriptorSet;
    struct timeval timeStruct;

    // set the timeout to 30 seconds
    timeStruct.tv_sec = 10;
    timeStruct.tv_usec = 0;
    FD_ZERO(&fileDescriptorSet);
    FD_SET(nativeSocket, &fileDescriptorSet);
    select(nativeSocket + 1, &fileDescriptorSet, NULL, NULL, &timeStruct);
    if (!FD_ISSET(nativeSocket, &fileDescriptorSet)) { // timeout
    std::string sMsg("TIMEOUT on read client data. Client IP: ");
    sMsg.append(sock.remote_endpoint().address().to_string());
    cout << sMsg << endl;
    return;
    }
    int recv_bytes = sock.receive_from(buffer(data), dns_server_ep);
    back_socket->send_to(buffer(data, recv_bytes), request_ep);
    sock.close();
    mu.lock();
    thread_count--;
    mu.unlock();
    cout << "alive thread is :" + to_string(thread_count) << endl;
    }


    void handle_connections() {
    io_service service;
    ip::udp::socket sock(service, ip::udp::endpoint(ip::udp::v4(), 53));
    while (true) {
    ip::udp::endpoint sender_ep;
    vector<unsigned char> buff(1024, 0);
    int bytes = sock.receive_from(buffer(buff), sender_ep);
    boost::thread m_thread(boost::bind(handle_request, sender_ep, buff, bytes, &sock));
    m_thread.detach();
    }
    }



    int main(int argc, char* argv[]) {
    handle_connections();
    }
    zjbztianya
        11
    zjbztianya  
       2016-11-27 11:39:55 +08:00
    @neoblackcap 公司要人么,感觉我很符合啊。。。 233333...知识点全是《 UNP 》和《 APUE 》的吧....最近刚好看了一遍。。。
    neoblackcap
        12
    neoblackcap  
       2016-11-27 11:51:39 +08:00
    @q397064399
    @zjbztianya
    我司在广州天河,若是感兴趣的话,欢迎联系本人

    echo server 纯手写并发 10 对于会的人来说当然不难,但是其中要掌握 socket 编程,系统的 IO 复用机制(select, poll, epoll)或者是 thread/process ,还有理解了同步,非同步,堵塞,非堵塞。这些很多人都已经不知道在说什么了。
    zjbztianya
        13
    zjbztianya  
       2016-11-27 12:01:35 +08:00
    @neoblackcap 怎么联系呢
    aias
        14
    aias  
       2016-11-27 12:04:46 +08:00   ❤️ 1
    简单来说可以从计算基础、 Java 语言和生产用的框架来点技能。一般像样点的单位比较看重你的基础,不像样的上来就问框架。
    neoblackcap
        15
    neoblackcap  
       2016-11-27 12:06:58 +08:00
    @zjbztianya 我的私人邮箱地址为 “ neo.blackcap 在 gmail.com ” 发送简历以及要面试什么什么岗位即可
    我司现招聘前端工程师,后端工程师( Java, Python)。后端嘛其实什么都搞,我们最近是在搞 PaaS 平台,欢迎各位有兴趣的联系我。同时请注明你是否面试实习的岗位,毕竟薪酬不一样要求不一样。
    zjbztianya
        16
    zjbztianya  
       2016-11-27 12:15:17 +08:00
    @neoblackcap 好的
    fantastM
        17
    fantastM  
       2016-11-27 13:22:42 +08:00   ❤️ 1
    java 基础最重要,框架仅是其次。算法、操作系统、网络是加分项
    q397064399
        18
    q397064399  
       2016-11-27 14:21:05 +08:00
    @neoblackcap 好的,尝试下
    Allianzcortex
        19
    Allianzcortex  
       2016-11-27 21:38:10 +08:00
    @neoblackcap 我也看过原版的《 CSAPP 》,我保留一下疑问哈。后端开发和服务端开发是两个概念,做后端的话实际上对 epoll/select 是不需要了解的,阻塞 /非阻塞 /同步 /异步属于概念上了解,可以选择就好(比如我熟悉 Python,那么需要知道 twisted/gevent )。还有 @q397064399 我不了解反射⊙﹏⊙b 汗,多线程也就是限于处理实时流的时候用 implements runnable 来多线程去发个邮件,但最近写 Java 也写的很开心。如果像我一样对 Java 的要求是用的话,掌握 Design Pattern 基本就够了。
    ihuotui
        20
    ihuotui  
       2016-11-27 21:50:17 +08:00   ❤️ 1
    整洁代码之道 设计模式 单元测试 java
    q397064399
        21
    q397064399  
       2016-11-27 22:52:23 +08:00
    @Allianzcortex
    后端开发确实对 同步 IO/异步 IO 以及阻塞模型 做概念上的了解即可(因为通常 指的都是 HTTP 服务器后端业务开发),
    跟服务端开发确实不是一个概念,因为绝大部分后端开发都是在成熟的框架下完成业务的编码

    拿 J2EE 来讲, Servlet3.0 规范之前是没有异步的 IO ,都是阻塞,然后每一个 HTTP 请求对应一个
    ServletRequest ,如果 Servlet 不返回信息,浏览器就会一直被阻塞,直到超时,而后端每一个请求对应一个线程
    这样也可以简化开发,另外针对 HTTP 的无状态的特性,大大降低了程序员的心智负担,仅需要在数据库操作的 Service
    层做事务跟并发同步 即可,其余的业务层 视图层都是针对单用户编写代码


    Java 的反射并不是多难,理解反射的概念 有助于理解框架,要想程序逻辑清晰,得面向切面编程吧,把事务控制
    日志记录 全向访问都通过 切面隔离开来,这样主线逻辑代码就会更清晰,这里就会用到 AOP


    对象的管理,不能总 new 来 new 去,肯定要交给对象容器来管理,现在连 Android 都开始流行 依赖注入跟 AOP 了
    直接用 @注解 +反射


    而 AOP 以及依赖注入提出来比较晚,所以没有上 Gof 设计模式那本书,你看过 Head First 设计模式就知道 Java 结合反射 动态代理来实现对象的装饰


    以前写 Android 是这样一个尿性


    public xxxActivity extends Activity {


    @Override
    protected onCreate(){
    xxxx;
    xxxx;
    findByView();
    findByView();
    findByView();
    }

    xxx = xxxObj.setOnClickListen(new onClickListen(){

    })
    }


    现在呢?
    直接注解,完事,然后交给框架去反射 装配我们的代码

    @Activity(label = "@string/app_name")
    @Layout(R.layout.main)
    public class HelloTransfuse {

    @Inject @View(R.id.textview)
    TextView textView;

    @Inject @Resource(R.string.hello)
    String helloText;

    @OnCreate
    public void hello() {
    textView.setText(helloText);
    }
    }
    neoblackcap
        22
    neoblackcap  
       2016-11-28 09:22:51 +08:00
    @q397064399
    @Allianzcortex
    哦你们这样划分的啊,我还一直以为后端是 backend ,也就是不跟用户交互的都是后端。不过在学习同步,异步,堵塞,非堵塞这个时候不接触到 epoll/select 这些 API 应该是比较难的吧, CSAPP 我是没看完, UNP 里面倒是会提到 select,这些 IO 复用机制必然是会提到啊。
    Java 对整体封装得比较好,但是了解一下底层的东西肯定是有加分的。毕竟公司又不是一直用 Java 。
    q397064399
        23
    q397064399  
       2016-11-28 09:51:14 +08:00
    @neoblackcap 不用 Java 难道拍簧片?
    q397064399
        24
    q397064399  
       2016-11-28 09:59:09 +08:00
    @neoblackcap
    除开游戏行业以及嵌入式行业有特殊需求外( Java 需要在 mina netty 等 tcp 网络框架下自己玩之外
    C++ C# 也有 tcp 网络框架)
    目前绝大部分应用开发 无论是企业应用还是商业软件 基本上都是 http 为主流了吧,
    移动 APP 基本上是 http ,自己写一套后台应用协议 估计还没上架 APP 公司就关门了
    ihuotui
        25
    ihuotui  
       2016-11-28 10:39:25 +08:00
    @neoblackcap 等你到了要别的语言再说吧, java 都没有学好,没有机会做别的。
    neoblackcap
        26
    neoblackcap  
       2016-11-28 10:56:40 +08:00   ❤️ 1
    @ihuotui
    @q397064399 公司业务不一样,我们这边有用 C ,有 lua ,有 Java ,有 Python 。我们组自然不用 Java ,但不代表公司不需要其他的。
    neoblackcap
        27
    neoblackcap  
       2016-11-28 10:59:33 +08:00
    @q397064399
    我们真的有用其他协议的,比如 mqtt,rtmp ,都是要基于这些东西搞研发的。还有 rpc 都是要考虑协议的,当然 rpc 就都是用其他库的了,不过我可以肯定我们用的不止 http
    jclin
        28
    jclin  
       2016-11-28 13:24:08 +08:00
    @depress 谢谢 了解了行情
    teemoer
        29
    teemoer  
       2016-11-29 00:58:44 +08:00
    打广告的机会又来了 java.sx 看完 差不多 就是 java 实习生的效果了哇
    teemoer
        30
    teemoer  
       2016-11-29 00:58:55 +08:00
    romennts
        31
    romennts  
       2016-12-13 19:35:26 +08:00 via Android
    这是我看过 V2EX 回复最厉害,最赞同的一次。以至于我不得不冒泡一下
    yxx278yxx
        32
    yxx278yxx  
       2016-12-15 18:35:27 +08:00
    可以的,展望 10k 的感觉要努力了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4123 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 05:22 · PVG 13:22 · LAX 21:22 · JFK 00:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.