精华内容
下载资源
问答
  • SpringSecurity前后端分离下对登录认证的管理

    万次阅读 热门讨论 2018-08-26 20:33:08
    &...本案例基于springboot2.0.4,只说登录验证的管理,不涉及权限的管理。因为学习新东西一子太多,很容易乱。(后面还有登录验证管理的源码分析)   &am

           本案例基于springboot2.0.4,只说对登录验证的管理,不涉及权限的管理。因为学习新东西一下子太多,很容易乱。
           首先添加maven依赖,直接开启springboot自带的spring security即可。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

           接下来配置config,需要继承WebSecurityConfigurerAdapter

    @SpringBootConfiguration
    public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    
        @Autowired
        private MyAuthenticationSuccessHandler myAuthenticationSuccessHandler;
    
        @Autowired
        private MyAuthenticationFailHandler myAuthenticationFailHandler;
    
        @Bean
        UserDetailsService customUserService() {
            return new MyCustomUserService();
        }
    
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            // 使用自定义UserDetailsService
            auth.userDetailsService(customUserService()).passwordEncoder(new BCryptPasswordEncoder());
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.formLogin().loginProcessingUrl("/user/login")
                    // 自定义的登录验证成功或失败后的去向
                    .successHandler(myAuthenticationSuccessHandler).failureHandler(myAuthenticationFailHandler)
                    // 禁用csrf防御机制(跨域请求伪造),这么做在测试和开发会比较方便。
                    .and().csrf().disable();
        }
    }

           如果验证数据是从数据库中获取的话还需要添加实现了UserDetailsService接口的类,操作数据使用的是mybatis,代码就不罗列了。

    @Component
    public class MyCustomUserService implements UserDetailsService {
    
        @Autowired
        private SysUserMapper sysUserMapper;
    
        /**
         * 登陆验证时,通过username获取用户的所有权限信息
         * 并返回UserDetails放到spring的全局缓存SecurityContextHolder中,以供授权器使用
         */
        @Override
        public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
            MyUserDetails myUserDetails = new MyUserDetails();
            myUserDetails.setUsername(username);
            SysUser sysUser = sysUserMapper.selectByKeyword(username);
            myUserDetails.setPassword(sysUser.getPassword());
            return myUserDetails;
        }
    }

           上面代码中的MyUserDetails是实现了UserDetails接口,自定义了返回对象。如果不使用MyUserDetails也可以,可以使用默认的User类,只不过验证就复杂点了,为了简化一些不必要的验证属性就自定义了一个UserDetails
    下面是User的代码的一些属性。(是不是挺杂乱的对于初学者)

        private static final long serialVersionUID = 500L;
        private static final Log logger = LogFactory.getLog(User.class);
        private String password;
        private final String username;
        private final Set<GrantedAuthority> authorities;
        private final boolean accountNonExpired;
        private final boolean accountNonLocked;
        private final boolean credentialsNonExpired;
        private final boolean enabled;

           这是自定义的MyUserDetails类,消除了一些不需要的属性对业务的影响。(只保留了3个属性)

    @Component
    public class MyUserDetails implements UserDetails {
    
        private String username;
    
        private String password;
    
        private Collection<? extends GrantedAuthority> authorities;
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public void setAuthorities(Collection<? extends GrantedAuthority> authorities) {
            this.authorities = authorities;
        }
    
        @Override
        public Collection<? extends GrantedAuthority> getAuthorities() {
            return this.authorities;
        }
    
        @Override
        public String getPassword() {
            return this.password;
        }
    
        @Override
        public String getUsername() {
            return this.username;
        }
    
        @Override
        public boolean isAccountNonExpired() {
            return true;
        }
    
        @Override
        public boolean isAccountNonLocked() {
            return true;
        }
    
        @Override
        public boolean isCredentialsNonExpired() {
            return true;
        }
    
        @Override
        public boolean isEnabled() {
            return true;
        }
    }

           还有两个登陆后去向类,这两个类就随意写了,根据业务需求来写即可。其实spring security本身也已经实现了默认的登录失败和登录成功去向,但是在前后端分离下,后端并不负责页面的跳转或者错误提示等。后端也会返回带有登录信息的Json格式的数据给前端,所以要想满足这些需求就需要实现AuthenticationFailureHandler和AuthenticationSuccessHandler接口。值得注意的是MyAuthenticationSuccessHandler类中的onAuthenticationFailure方法可以打印异常(错误)信息。

    @Component
    public class MyAuthenticationFailHandler implements AuthenticationFailureHandler {
        @Override
        public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
            // 允许跨域
            httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
            // 允许自定义请求头token(允许head跨域)
            httpServletResponse.setHeader("Access-Control-Allow-Headers", "token, Accept, Origin, X-Requested-With, Content-Type, Last-Modified");
            httpServletResponse.getWriter().write(200);
        }
    }
    
    @Component
    public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
    
        @Override
        public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
            // 允许跨域
            httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
            // 允许自定义请求头token(允许head跨域)
            httpServletResponse.setHeader("Access-Control-Allow-Headers", "token, Accept, Origin, X-Requested-With, Content-Type, Last-Modified");
            httpServletResponse.getWriter().write(e.getMessage());
        }
    }

           接下来就是前端的登录代码,该action需要和WebSecurityConfiguration类中loginProcessingUrl(“/user/login”)的值一致。当然了下面的代码也可以用ajax来替代,不一定要用from表单登录。

    <form action='/user/login' method='POST'>
        <table>
            <tr>
                <td>User:</td>
                <td><input type='text' name='username' value=''></td>
            </tr>
            <tr>
                <td>Password:</td>
                <td><input type='password' name='password'/></td>
            </tr>
        </table>
    </form>

           以上就是简单的spring security在前后端分离下的运用例子。不过光是这么写,不明白的人看了还是一头雾水,也不能充分展示spring security的强大。

    --------------------------------------

    重点再说下WebSecurityConfiguration类
    在WebSecurityConfiguration类中需要把自定义的MyAuthenticationSuccessHandler和MyAuthenticationFailHandler去向类注入,并在loginProcessingUrl(“/user/login”)后面激活这两个类的使用

    @Autowired
    private MyAuthenticationSuccessHandler myAuthenticationSuccessHandler;
    @Autowired
    private MyAuthenticationFailHandler myAuthenticationFailHandler;
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin().loginProcessingUrl("/user/login")
                // 自定义的登录验证成功或失败后的去向
                .successHandler(myAuthenticationSuccessHandler).failureHandler(myAuthenticationFailHandler)
                // 禁用csrf防御机制(跨域请求伪造),这么做在测试和开发会比较方便。
                .and().csrf().disable();
    }

    自定义MyUserDetailsService类也需要在WebSecurityConfiguration类中注入和激活使用

    @Bean
    UserDetailsService customUserService() {
        return new MyCustomUserService();
    }
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 使用自定义UserDetailsService
        auth.userDetailsService(customUserService()).passwordEncoder(new BCryptPasswordEncoder());
    }

           上面的代码有个.passwordEncoder(new BCryptPasswordEncoder())这个意思就是指定密码加密的方式。这里采用的是BCrypt加密方式。换句话说,当spring security获取到你前端传过来的密码时,就自动用BCrypt加密密码,然后拿去和数据库密码匹对。所以在数据库里存的密码也得是用BCrypt加密后的密码。
           如果这么说,是不是也可以指定自定义加密方式呢。是可以的,实现也很简单,只要实现PasswordEncoder接口即可。在把.passwordEncoder(new BCryptPasswordEncoder())更改为.passwordEncoder(new MyPasswordEncoder())即可。

    @Component
    public class MyPasswordEncoder implements PasswordEncoder {
    
        @Override
        public String encode(CharSequence charSequence) {
            return SecurityUtil.encrypt(charSequence.toString());
        }
    
        @Override
        public boolean matches(CharSequence charSequence, String s) {
            return encode(charSequence).equals(s);
        }
    }

    接下来说下这个

    http.formLogin().loginProcessingUrl("/user/login")
              // 自定义的登录验证成功或失败后的去向
              .successHandler(myAuthenticationSuccessHandler).failureHandler(myAuthenticationFailHandler)
              // 禁用csrf防御机制(跨域请求伪造),这么做在测试和开发会比较方便。
              .and().csrf().disable();

           关于这个一般来写的话都是有http.forLogin().loginPage(“/login”)啥的,这个是自定义登录页面,默认为/login。说白了就是你访问spring security保护的请求时候如果发现你没有登录,就会跳转到指定页面,使用默认或者不写的话spring security就会跳转到已经帮你写好了一个默认登录页面了。在前后端分离下,这个就不管了。loginProcessingUrl(“/user/login”)就是登录请求。

    光是看上面的似乎有点囫囵吞枣,建议在看另一篇博文,主要分析登录验证的过程和一些源码的浅析。(写的不咋滴,但是认真看完后我觉得应该会有所收获)
    SpringSecurity登录验证步骤和源码浅析

    展开全文
  • 这些不同岗位的「技术负责人」在工作中会处理着各不相同的问题,因此他能力要求的侧重点肯定也是不同的。 比如,CTO/技术VP 是需要有全面的综合能力,具有公司战略、研发体系搭建、人才策略的能力;而 技术主管 ...

    「技术负责人」这一称呼其实比较泛了。往大了讲,可以指 CTO、技术VP、技术总监,往小了讲,可以指 小组Leader、技术主管、架构师 等。

    这些不同岗位的「技术负责人」在工作中会处理着各不相同的问题,因此对他能力要求的侧重点肯定也是不同的。

    比如,CTO/技术VP 是需要有全面的综合能力,具有公司战略、研发体系搭建、人才策略的能力;而 技术主管 则更偏向于技术架构、带领团队、技术落地的能力。

    不仅如此,甚至就算是同一个角色/岗位,在公司发展的不同阶段,也需要侧重不同的能力。

    以技术经理为例,如果是在公司刚起步的创业阶段,需要具备极强的带领团队去披荆斩棘、冲锋陷阵的能力,能使产品快速的落地,需亲自带人培养团队,支撑业务的增长。而如果公司到了一个业务稳定时期,此时的技术经理,需具备研发文化搭建能力、团队管理能力、规范构造能力。

    好了,既然各类「技术负责人」在处于不同的角色、不同的时期,所需要的能力有而不尽相同,
    那么,到底什么才是衡量「技术负责人」核心能力的标准呢?

    那就需要我们从中去找出一些共同点的地方,这些 共性 的东西,就是作为一名优秀的技术负责人自始至终所应具备的核心能力。

    我认为它主要包括4点:技术视野、商业洞察力、自我进化力 以及 团队力,下面来一一阐述:

    一、具备良好技术视野,能洞察技术行业趋势

    需要「技术负责人」有丰富的经验和技术沉淀,具有优秀的架构设计能力,虽然不要求对各类技术都精通,但是必须有自己专精深入的方向,且对其它技术领域都有涉猎。能够知道在什么场景、什么阶段应用哪些技术。具备一定的技术前瞻性,清楚的知道团队应该做哪些技术的储备和预研。

    能够用清晰易懂、普通人都能理解的语言/话术,把技术给讲清楚。这一点非常重要,我觉得普通技术人员与技术主管的很重要的一个区别就在这里,技术人很容易沉浸在自己的技术世界里,沟通起来一嘴儿的专业术语,导致产品同学、运营同学以及其他合作的同学很难理解他想表达的技术和逻辑,就会带来沟通上的不畅。

    因此用人话把技术讲清楚也是一项非常关键的能力。

    另外就是技术宣传能力,技术团队往往属于一种默默无闻付出型的一群人,善于用技术去解决问题,但并不善于去表达自己的能力和成绩,因此作为团队的技术负责人,应具备一定的技术宣传能力,对技术团队而言非常有帮助。

    二、具备敏锐的商业洞察力和产品意识

    提到 商业洞察和产品意识,可能很多技术同学会觉得这似乎不是技术人成长的重点。
    但事实上,恰恰相反,我认为商业敏感性和产品意识也许对普通技术同学而言不是那么重要,但对于一名技术负责人而言,就尤为关键了。

    因为,一名优秀的技术负责人,必须要懂业务懂产品,这样不仅在与业务、运营部门做需求沟通时,会更顺畅。而且,因为有了产品意识和业务视野,也会更有利于自己对技术的判断,会帮助我们更好的去制定技术方案、优先级等研发决策。

    同时,做到深刻的理解客户和产品,才能从更高的层面去研发产品、从技术可实现的角度去改进产品,把技术和商业结合起来,才能更大的发挥技术的价值。

    三、迭代自己的能力

    作为技术负责人,必须要有「迭代自己的能力」,这里的迭代自己,是指具有出色的学习能力。因为IT互联网行业的技术日新月异,每个月都有新的技术出来,如果没有持续不断的学习能力,是很难跟上技术趋势,实现技术价值的。

    同时,这里的「迭代自己」又不仅仅是指学习能力,它应该还包括自我反思、自我重塑的能力。
    例如我们经常可以看到武侠剧中的一些剑侠们,为了学习最高层次的剑法,需要他改变自己之前剑法习惯、忘掉自己已掌握的一些低层次剑法,才能吸收新的剑法,才会有新的认识,更高的提升。

    四、带团队能力

    作为技术负责人,必须能打造一支能战斗的团队、能够打造技术文化,构建开放的技术氛围。
    具有一定的影响力,能团结凝聚更多的小伙伴,吸引到志同道合的小伙伴们一起共同奋斗。
    对团队人员素质要有准确的判断、做好分工协作、关心团队小伙伴的成长、且需要有极强的沟通能力、能够管理自己的上级和下级。

    因为能力再强的个人也比不上一只优秀的团队,因此对于技术负责人而言,能带好一个团队,是对他最基础的要求,也只有做好了这一点,才能真正称之为技术小伙伴们的带路人。

    以上四点我认为是作为一名技术负责人应具备的核心能力,希望大家可以一起探讨。

    愿每一位技术人都能找到适合自己的技术道路,坚持初心,爱你所爱,行你所行,听从你心,无问西东。

    展开全文
  • 谈谈我项目管理的理解

    万次阅读 2017-07-21 16:19:37
    说起项目管理,那都是血和泪啊!每次做项目都将面对不一样的风险,不一样的人,而项目管理的难度就在于它的复杂性,这就要求...首先,是组织结构项目的影响。有些IT公司的组织架构包含项目部、开发部、测试部等,项目

    说起项目管理,那都是血和泪啊!每次做项目都将面对不一样的风险,不一样的人,而项目管理的难度就在于它的复杂性,这就要求必须时刻调整自己,也必须具备更多、更全面的知识和能力。

    关于如何进行项目管理,项目经理在日常工作中应该如何协调各部门?这些都是一门学问。也针对这些问题,谈谈我在工作中遇到的几种情况及处理经验:

    首先,是组织结构对项目的影响。有些IT公司的组织架构包含项目部、开发部、测试部等,项目由项目部牵头,项目组成员分散到各个职能部门。这种项目可能存在部门配合效果不好,项目经理解决的力度也弱化了,往往需要领导间协调,不过领导的精力是有限的,部门间的利益是明确的,所以可能有些问题难以解决,直接导致沟通成本提高,项目版本计划延后,业务部门意见很大。

    硬性的制度解决起来问题成本太高还不一定奏效,所以只能运用些软技能了。

    一是积累下来的人脉。人是有情感的动物,一般平时关系好的同事在工作上也不会生硬的拒绝你,所以尽量在平时维护好各关键部门、关键岗位同事的关系,都说人敬我一尺,我敬人一丈,在工作中也是如此,该较真的地方严格,但是其他地方一定要灵活,根据员工年龄结构的特点进行工作任务分配。大部分同事,尤其是一二线的同事,慢慢步入了结婚生子的阶段,这时候重心不可能不发生偏移,一味强调以工作为重鬼才相信。所以项目经理在编制计划、安排工作、召开会议都一系列需要和其他人发生联系的工作上,一定要考虑别人的实际情况和感受,尊重、理解而且宽容,才能赢得别人的尊重,这也是在提高自己的人格魅力。

    二是提高自己的领导力。解决部门外、部门间,部门内部相互推诿扯皮的事情,需要项目经理做到公正灵活。在熟悉业务和技术的基础上,去和大家一起解决问题,在工作中需要非常注意当面的或电话中的用词、邮件上的写法,比如把“你们”换成“咱们”,“目前进度如何”细化到“具体某个测试问题今天能搞定吗,需要我做什么”等,要求反馈的同事及时的表达谢意,并注意让所属领导了解。同时,注意项目间的博弈和部门间的平衡,灵活的去选择问题的上升还是等待,有时候会发现,一些问题不要着急求结果,项目经理首先不能身在庐山当中,先静下心来找出问题的本质,再全力的去解决,注意在过程中找对关键路径的关键负责人。

    再说说在项目组内部如何协调好开发和测试的关系吧。举个例子某个SRM项目在系统测试阶段,开发经理和测试经理关于提交的测试问题数量存在争论,开发经理认为测试部门提交问题重复,且数量过多;而测试经理认为项目办对于测试部门给出了测试标杆值,她是按照这个来执行的,而且她认为开发经理一味偏袒开发人员,且拒绝修改的问题答复过于简单。

    针对以上这些情况,需要首先了解一下标杆值的问题,这个值是开发中心项目办公室根据每个应用以往的历史数据给出的每百功能点发版前的问题数参考值,比如该项目涉及的应用是百功能点的问题,但这只是一个参考值,所以测试经理以此作为依据进行问题数目的控制是不必要的。同时去测试经理那里了解了一下实际情况,部分问题确实是相同问题,但是部门的要求是回复的时候可以选择相同问题回复,但是不要直接打回拒绝修改且写明是相同问题,这也是该部门领导一再强调的,所以碰到这种情况测试经理坚决不会同意关闭。同时在开发这边了解到,开发人员对于一个公用模块提多个问题非常反感,修改一处程序而填写问题清单的时候要填写多条记录。

    针对这种情况,我和开发经理、测试经理沟通之后做了如下要求:首先为了保证测试进度和质量,测试方面发现问题该提就提,但是没有必要以测试标杆给出的值作为测试标准,要以实际情况为准;其次,开发人员和测试人员多沟通,从源头上避免一个公共模块提多个问题的情况,但如果一旦问题提交了,开发人员就按照相同问题处理,不要拒绝修改,这个我也告知了开发经理对于项目的有效问题数不会有影响。同时由于考虑到个人面子问题,我和测试经理单独做了沟通,请她避免提交过多相同类型的问题,提交之前可以先和开发经理打个招呼。

    这件事上说几点自己的感触吧,一是解决问题的关键在人,尽量去试着理解问题解决对象的心理和难处,没有人会拒绝善意的帮助;二是要尊重别人,项目经理是润滑剂,不是皮鞭,我觉得这个比喻应该很明了了,不多说;三是关注项目的外部环境,比如项目考核制度,人员晋升制度等,这样项目经理才不会被别人在背后骂。

    以上就是我个人在工作中的一些经验,但愿能与大家共勉。
    展开全文
  • 一个工程师流程管理的思考[转]

    千次阅读 2014-05-16 19:35:04
    我平时很少写博客,我是个技术人员,一般来说技术人员的博客应该以技术为主,但同时我又是一个懒人,对于...因为过去经历的一些事促使我项目的流程管理进行一些思考,并形成了自己的一套看法和逻辑,而我也很愿意将

            我平时很少写博客,我是个技术人员,一般来说技术人员的博客应该以技术为主,但同时我又是一个懒人,对于技术我喜欢“亲身体验”而不喜欢“写出来”,因为我觉得把技术对别人说清楚要比实现它更困难。实际上这段时间我都在看别人的博客,所以一直以来我只是个吃白食的:)

            为什么现在我要跨界谈一个偏重管理类的话题呢?因为过去经历的一些事促使我对项目的流程管理进行一些思考,并形成了自己的一套看法和逻辑,而我也很愿意将我的看法发表成文,不喜欢憋在脑海里太久。至于能得到多少认同倒是并不在意,我觉得一个人观念的形成源于他对事物本质的理解和认知,而这种理解和认知又同他过去的经历有关。在此通报一下我过去的工作经历,本人电气专业出身,在一家台资IC企业做过三年软件工程师,无任何工程管理上的学位和经验,所以题目定为“一个工程师的思考”以避免把话说太满。但我不认为一个话题出自一个非专业人士之口就得贴上“瞎BB”的标签,作为工程师的我好歹也是大工业时代整条生产链上的一颗“螺丝钉”,虽然项目流程不是我设计的,但身为一颗“螺丝钉”也有反馈一下的权利吧。何况我也不想洋洋万言写成精品,权当一家之言耳。

            流程管理在生产上已被奉行多年,但围绕它的争议仍不停歇。有些人喜欢它,认为流程提升了生产效率,有利于培养企业文化;有些人排斥它,认为它束手束脚,僵化死板。前者大多出自管理层,后者大多出自工程师,他们都是站在自己的立场看问题的,能不能统一起来看呢?我们到底需不需要流程?或者多大程度上接受它?在阐述我的逻辑之前,先从我对流程的认知说起。

            流程的本质是什么?我的理解是流程是一种介入机制托管机制“介入”是指生产环节上多大程度让外部势力参与和干预,主要表现为人员分工;“托管”是指存在一种自动化工具帮你简化一些步骤,表现为对工具的使用。它们的区别相当于载人飞船和无人飞船。当我们说“这个项目应该走个流程”实际上等价于“要让外部人员参与进来”以及“你该试试这个工具”这些同义语。

            让我们以开源项目Linux为例深入解释一下。在上世纪90年代初出现了Linux内核,是由芬兰21岁的大学生Linus Torvalds开发的,他先是写了一个多任务的终端仿真程序来连接modem,又写了一个磁盘驱动程序访问硬盘,再写了一个文件系统管理资源,后来又移植了bash和gcc,一个操作系统雏形就这样建立起来。在这个阶段都是Linus一个人DIY,并没有他人介入,顶多也就通过邮件同少量用户交流一些需求。而且当时工具也不太发达,他甚至不得不手动修改gcc源代码以实现内核自编译。不管怎么样,个人项目还是发布了。后来开始有人协助加入图形、网络各种服务和模块,再后来就演变成一项声势浩大的开源运动,连商业公司都参与进来开发各种发行版。这是Linus意识到自己必须放手,因为随着用户需求的增多,代码量膨胀,版本发布周期也在缩短,这也是为何Linus又发明了版本控制软件git;社区发展壮大导致成千上万开发者参与其中,不仅仅贡献代码,测试、写文档、打包、做网页、翻译、技术支持、售前售后……把整条生产线纳进来了。这么多人,这么多活,没有分工,没有秩序显然是行不通的,于是就像商业公司一样,开源项目也要建立一套好流程,以便外部人员顺利平滑地介入。

            上面提到的“介入”和“托管”两种机制,前者是参与分工,后者是工具使用,现在大多数开发者和管理层对工具使用都有某种共识,而且事实上实施很多年了。真正的分歧在于“介入”,这也是流程管理中最大的争议,因为工具是可以替换的,而一旦“介入”是不可逆转的,因为一旦介入,你很难把别人清退出去。何时介入,介入程度多深都会成为争议焦点。一个工程师在项目早期的构思建模阶段一般是不欢迎他人参与进来的,很多人说这会干扰他们的思路,顶多开放一些有限的口头交流,但想要往我的代码中提交pull request(以下简称PR),没门!这种情形不禁让人联想到家里养的母猫在小猫尚未睁眼之前不允许任何人触碰,就算自家主人也不行,不然就摆出一副凶巴巴要跟你拼命的架势(狗妈妈可能无所谓,这也是为何有的程序员性格更像猫而不是狗一样易于管教)。母猫的想法可能是这样的:1.这是我亲生的,凭什么让你碰?2.抚养的细节只有我最懂,兽医也不行。这同一些主观意识强烈的工程师心理如出一辙,这也解释了他们同别的工程师甚至管理层在流程问题上发生争执,说白了就是不想被介入。但随着小猫的成长,母猫终究还是会允许主人帮忙照料养育自己的孩子,以分担一些麻烦,如同工程师最终还是会与团队一同坐下来商谈软件打包发布等各种琐事,以及放开并回应来自社区提交的PR。

            如何看待流程早期介入的必要性?从工程师的角度看我更倾向于早期不介入为好,因为程序最初的构造是靠人的创造性思维,开发人员需要在脑海中(或纸上)精心构建一座模型大厦,这种思维具备某种独立性和连贯性,最不希望被打断或中途崩塌,否则情绪上无法接受。对项目主管来说,如果限定时间内一个人就能搞定的模块,就让他放手去做好了;如果是几个模块分工,就按照个人的专业水平安排各写各的好了;时间允许的话,最好不要几个人共写一个模块,除非结对编程。用Linus的话来说“从一开始就告诉自己这份工作只有你一个人负责,并且做好完成它的准备。如果你一开始就认为全世界的人们都会联合起来为你的项目工作,一起创造一个更美好的世界,那么你可能不会走得很远。”

             这里还有成员之间的信任问题,主管是否应该在背后监视每一行代码?这是值得讨论的,我还是引用Linus那句话“不要试图控制别人和他们的代码。”有的主管提出代码质量的忧虑,但这引申出另外一个命题,如果代码质量可以衡量一个程序员个人能力,你担心开发过程中的质量,那当初何必把他招进来呢?如果代码质量真出了问题,那就是招聘时埋下的隐患了,作为管理层自身也有责任的。

             这里还要说一下,不介入不等于成员之间不交流不讨论了,不同意见的交换是有益的,但只是参考而不是强制性的,而且这种交流最好由工程师主动提出来,主管只负责调整项目进度。另外code review是十分必要的,但时间线最好授权给工程师自己把握,免得一个不成熟的构思匆忙提交下去一通review给提前定型了,何况开发人员在此期间还会私下里觉得不满还会推翻重来,搞得其他成员浪费时间白白折腾。当然我相信一个好的工程师也应该有良好的自觉性和自律性,在招人的时候成为考察重点,要胜过在开发过程中背后另外搞一套监控。

             以上讨论的主要是流程管理早期介入的问题,中后期的介入机制会比较复杂比较细节化,由于笔者经验水平所限不便多谈。个人觉得介入也需要同项目团队的规模匹配,根据现状和进度因势导利,逐步介入,而非开闸泄洪,一口一个胖子。另外不同公司的流程制度照搬要谨慎,如同协议那样,如果达不成共识而强行介入,反而对团队不利。

           下面谈谈托管机制,也就是工具的使用。其实比起介入没啥好谈的,因为无论是管理层还是工程师都认同工具在流程效率上的重要性,事实上早已使用很多年了。就我个人而言,版本控制用过perforce和git,项目管理用过redmine和trello,各有各的特色。工具也不限于软件,开发语言本身也是一种工具,比如一些高级语言实际上也提供了“托管”功能,帮程序员管理内存、实现并发之类的。工具的一个优势在于将一些重复低效的劳动从流程中剥离出来,简化为开发人员对工具的使用技能,比如面试官在招人时只需要问你会不会使用git而不会让你自己手动merge代码。另一个优势就是讲流程中的操作规范化、标准化,比如git的成功在于它借鉴了Unix的KISS原则设计了一套简单命令接口:clone、add、reset、rm、commit、checkout、push、pull等,这么几个命令足以满足全球最大开源项目Linux的日常代码托管需求了,难怪后来衍生出github、gitlab各种git家族都遵循同一套命令接口,如同达成默契的协议,你只要会用git,就可以在所有开源托管平台上来去自如,让流程简化效率提升。好的工具使得全球范围内的协作项目成为可能,事实也证明了Linux社区所取得的成功。

            与此同时我也思考过这两种机制之间的辩证关系,因为一个是“载人”的,一个是“无人”的,我曾怀疑过当管理工具日益强大时,来自外部势力的介入需求会否因而减少,也就是说介入和托管在流程管理中的比重是否是此消彼长的?如果是,这个世界的生产链条上人是否终将被工具取代呢?过剩的人力资源是否使得未来工程师失业呢?在现实世界中的确看到大量个人项目,只要凭借个人对工具技能的掌握,完全不需要外人介入就能完成整个项目流程。然而答案是否定的。因为托管工具仅仅是将低效重复的劳动从流程中剥离,并未满足全球科技行业日益增长的创造性需求。也许以前那些从事手工merge代码的专职人员因此失业,但从全局来看是好事,那就是将开发人员从日常繁杂事物中解放出来,投入到更激动人心的创造性活动中去。只要人的脑容量增长速率追不上人类社会发展出现的各种变动,市场仍需要更多工程师投身其中,协同参与。现实世界也并未印证这种担忧,开源项目的代码量和参与人数都在逐年上升中。

           如果你的团队在项目开发上进展不顺,不妨回过头来看看自己的流程管理,当初在人才选拔和介入机制上是否需要整改,亦或是换一个更先进的工具。

     

    本篇博客转自开源中国:http://my.oschina.net/fullofbull/blog/263410

    展开全文
  • 小王上任后,根据一般原则梳理了合同管理的主要内容,在此基础制定了公司的合同管理制度,并将该制度分发给各项目组和职能部门。同时将自己的职责主要确定为所有项目合同进行分析和审核,降低项目合同的风险。 ...
  • 谈谈我软件开发项目管理的理解

    万次阅读 2017-02-17 02:48:59
    首先声明一下,我并不是一个PM,也从未做过与项目管理相关的工作。作为一个每天都偏安一角静静地写代码的程序猿,本不应该发表与项目管理相关的观点。无奈,以个人的角度和眼光,鉴于工作中出现的一些问题,还是想在...
  • B 市是北方的一个超大型城市,最近市政府有关部门提出需要加强全市交通的管理与控制。 2008年9月19日B市政府决定实施智能交通管理系统项目,路面人流和车流实现实时的、量化的监控和管理。项目要求于2009年2月1...
  • 日项目中,部长即为总体项目负责人,接下来项目会落实到PM(项目经理PM),项目经理将任务分成若干个子项目,每个项目由一个PL(项目组长)负责。在每个子项目中,由SE(系统工程师)带领PG(程序员)共同完成。其中,PM...
  • Python下文管理

    千次阅读 多人点赞 2020-09-25 10:51:34
    1. 下文管理器 一个类只要实现了 __enter__() 和 __exit__() 这个两个方法,通过该类创建的对象我们就称之为下文管理器。 下文管理器可以使用 with 语句,with语句之所以这么强大,背后是由下文管理器做支撑...
  • 外包开发模式gitlab与OpenProject联动的开发过程管理 背景 所负责的消金业务是由之前采购的多家公司的多个系统及其驻场人员维护开发的。由于技术架构不统一,系统运维标准也很不相同。甚至经常出现工程师在本地...
  • java web简单权限管理设计

    万次阅读 多人点赞 2015-03-19 23:23:05
    注:由于该项目比较老,所以没有采用maven管理,建议下载springboot权限管理系统,学习和使用会更有帮助。 springboot权限管理系统介绍地址:https://blog.csdn.net/zwx19921215/article/details/978...
  • 集团总经理责成信息中心主任李某负责此事。李某找到曾经承担集团内部网络系统工程的系统集成商A公司,提出了集团的需求。A公司管理层开会研究后命令项目经理张某积极跟进,与李某密切联系。张某通过上网搜索,发现...
  • 学生选课管理系统(

    千次阅读 多人点赞 2019-09-11 09:43:36
    学生选课管理系统() 设计内容与要求: 1、系统用户由三类组成:教师、学生和管理员。 2、管理负责的主要功能: ①用户管理(老师、学生及管理员的增、删、改); ②课程管理(添加、删除和修改); ③...
  • 测试管理之--用例管理

    千次阅读 2018-08-07 18:24:53
    测试用例包括如下元素:测试用例编号、测试内容、测试条件、测试过程、预期结果、实际测试结果、备注、测试时间记录、测试人员、项目负责人、监督人员、测试日期等。 典型的测试用例模板如下所示: 用例管理1.0...
  • 2009年半年 系统集成项目管理工程师 上午试卷 (考试时间 9 : 00~11 : 30 共 150 分钟) 请按下述要求正确填写答题卡 1. 在答题卡的指定位置正确写入你的姓名和准考证号,并用正规 2B 铅笔在你...
  • 项目管理学习总结(11)——项目管理怎么做

    千次阅读 多人点赞 2018-07-16 16:38:21
    但我觉得,产品经理是一定要懂项目管理的,否则在各种团队项目紧急的情况,是难以攻坚的。 举个我自身的例子来讲: 1年左右,我产品经理的认知是:产品经理为结果和效果负责,如果结果达不到预期,就是执行人员...
  • 小赵具有3年的软件项目开发与管理经验。公司认为这个项目的技术难度比较低,把两个月前刚从大学招聘来的9个计算机科学与技术转移的应届毕业生分配到这个项目组,这样,项目开发团队顺利建立了。项目的开发按照所制定...
  • 在实施过程中,建设方提出一些新需求,原有需求也做了一定的更改。承建方项目组经评估认为新需求可能会导致工期延迟和项目成本大幅增加,因此拒绝了建设方的要求,并让此项目的销售人员通知建设方。当销售人员告知...
  • 接到任务后,项目经理小王开始着手编制项目管理计划,根据招标文件,小王列出了一个初步的进度计划,进度计划中的各里程碑点正好是甲方招标文件中规定的各时间节点。随后,小王估计了项目的各项开销,确定了项目预算...
  • 试题一 某信息系统集成公司(承建方)成功中标当地政府某部门(建设方)办公场所的一项信息系统软件升级改造项目。项目自2月初开始,工期1年。...由于该项目的按时完成承建方非常重要,在双方就合同达
  • 2009年半年 信息系统项目管理师 上午试卷 (考试时间 9 : 00~11 : 30 共 150 分钟) 1. 在答题卡的指定位置正确写入你的姓名和准考证号,并用正规 2B 铅笔在你写入的准考证号填涂准考证号。 2. 本试卷的...
  • 2011年半年 信息系统项目管理师 上午试卷 (考试时间 9 : 00~11 : 30 共 150 分钟) 1. 在答题卡的指定位置正确写入你的姓名和准考证号,并用正规 2B 铅笔在你写入的准考证号填涂准考证号。 2. 本试卷的...
  • 某医院为了整合医院资源,解决病人就医难的问题,拟构建一套网络预约就医信息管理系统,以方便医院管理和病人就诊。该系统的部分功能及初步需求分析的结果如下 所述: (1)科室信息包括科室号、科室名、科室电话...
  • 2018半年信息系统项目管理师下午试卷I (考试时间14:00~16:30共150分钟) 1.在答题纸的指定位置填写你所在的省、自治区、直辖市、计划单列市的名称。 2.在答题纸的指定位置填写准考证号、出生年月日和姓名。 ...
  • 我们的管理:项目管理

    万次阅读 2013-11-14 16:07:59
    我们的管理:项目管理一、管理导向与管理组织我们是一个严重偏爱PDCA的公司,意即计划、执行、检查、改进。所以说,我们虽然实行井田制管理,又有部门经理又有项目经理,但实权主要在项目经理的手里。我们讲/做任何...
  • 本文来谈一下我对管理规划的理解,希望大家有启发。 规划其实大家都知道,只是平时思考的稍微少一点。比如说做事情需要有规划,自己的人生需要规划,理财需要规划,生活需要规划等等,每天的工作需要规划等等,...
  • Melon(梅隆)协议是一种以太坊的数字资产管理的区块链协议,它允许参与者用公开、竞争和去中心化的方式发起、管理和投资数字资产。Melon协议在以太坊的Dapp代币MLN(梅隆币)已经在Kraken上线交易。 第1节:...
  • 项目管理复习题

    万次阅读 多人点赞 2020-09-18 11:54:44
    2.项目管理包括(启动过程组)、(计划过程组)、(执行过程组)、(控制过程组)、(收尾过程组)5个过程组。 二、判断题 1、搬家属于项目。(√) 2、项目是为了创造一个唯一的产品或提供一个唯一的服务而进行...
  • 它由一系列正式的书面程序组成,用于以下工作提供技术和管理方面的指导与监督:识别并记录产品、成果、服务或部件的功能特征和物理特征;控制上述特征的任何变更;记录并报告每一项变更及其实施情况;支持产品...
  • Futarchy: 价值投票,赌信念

    万次阅读 2019-05-10 10:32:28
    Futarchy: 价值投票,赌信念 byRobin Hanson 这段简短的“声明”描述了一种新的管理方式。在“futarchy”中,我们可以价值投票,...当选代表国民福利,会在形式规定和管理“事后”措施,同时市场投机者...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 989,684
精华内容 395,873
关键字:

对上管理对下负责