• 开源镜像
  • 开源沙龙
  • 媛宝
  • 猿帅
  • 注册
  • 登录
  • 息壤开源生活方式平台
  • 加入我们

开源日报

  • 2018年12月2日:开源日报第269期

    2 12 月, 2018

    每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,欢迎关注开源日报。交流QQ群:202790710;微博:https://weibo.com/openingsource;电报群 https://t.me/OpeningSourceOrg


    今日推荐开源项目:《三十三概念 33-js-concepts》传送门:GitHub链接

    推荐理由:三十三个 JS 开发者都需要了解的概念。实际上第三十三条——代码整洁之道应该是所有开发者都需要了解的,除开这条之外还包括了递归算法数据结构这些基础概念和 map,filter 这样的高阶函数介绍,如果想要提高自己的 JS 水平的话可以作为一个阅读指南来参考,每一个概念都提供了不少相关链接。


    今日推荐英文原文:《Product Roadmaps: Love, Hate (& Hate)》作者:Kyle Evans

    原文链接:https://productcoalition.com/product-roadmaps-love-and-hate-and-hate-1a750b263d15

    推荐理由:路线图是用来对未来进行规划的图纸,它和计划不同,并不关心详细的执行步骤而是为所有人提供一个大概的指导方向,这篇文章就介绍了关于路线图的一些特征。

    Product Roadmaps: Love, Hate (& Hate)

    If I could pick one thing to kill because of the problems it causes, roadmaps might very well be at the top of the list. And it’s not that I don’t like roadmaps, or at least the principle of a product roadmaps. It’s the misunderstandings that they bring. Sometimes the misinterpretation of a roadmap actually causes far more problems than the roadmap sets out to solve. Why is that? And what can we do?

    Purpose of a Roadmap

    The first thing is to really understand the purpose (or purposes) of a product roadmap. Fundamentally, a roadmap is a strategic document used to create the overarching product vision, articulating the value you’re delivering to users and the business in order to gain support and alignment.

    I break this down into a few key categories:

    1. Inspiration and Vision: A roadmap is meant to help others see the vision of what we’re doing. This is one of the most critical purposes of a roadmap because without a coherent vision, no product will be successful and no team will be functional.
    2. Communication: A roadmap is a communication device. It is meant not only to inspire, but also to allow users and business partners to know what is coming up and where the focus will be. It helps take the overarching vision and make it understandable and clear. Many groups simply need to know what’s coming in order to prepare for it. And a roadmap is a great way to accomplish that.
    3. Discussion: The roadmap is meant to help facilitate discussion about the direction and focus of what we’re doing. Hopefully once we’ve created the vision and opened the channels of communication, we can have the right discussions about the problems we’re solving and the outcomes we’re focused on. This is critical because we also want to get feedback on our roadmap. It can be the first “test” of our strategy ensuring that we’ve prioritized correctly. That feedback can be invaluable in ensuring direction and buy-in.
    4. Alignment: And of course, once we’ve had the critical discussions, the purpose is to get alignment around our product strategy and outcomes. A roadmap facilitates all of this communication and planning to ensure our product team is focused on achieving the right outcomes for our users and our business. It helps align our product teams and our stakeholders so we’re working toward a common purpose and goal.

    All of these pieces are crucial, because a roadmap is a living document. The purpose of a roadmap isn’t to create an artifact that we can refer people to or post on a page somewhere. The items above are a continual loop as we learn iterate. By creating the vision, having the right conversations with users and stakeholders, and adding the learning that we get as we progress, we can continually refine our direction and plan for the future.

    So Where Does This Go Wrong?

    The purpose of the roadmap sounds great. Who doesn’t want to inspire their users and stakeholders while ensuring everyone is strategically aligned? Why would anyone want to kill that? Where does this go wrong?

    A roadmap is not a project plan. Far too often a roadmap gets confused for a project plan. A roadmap isn’t meant to be the detailed execution of specific projects. It’s not meant to commit to dates for releases or timelines for features. There is certainly a place for that level of specificity, but it isn’t the roadmap, especially as we look several quarters into the future.

    A roadmap is not set in stone. This is probably one of the biggest problems that many of us have faced. Far too often a plan is put in place at the beginning of the year with themes or focuses for the entire year. And we get stakeholders or users who view the roadmap as a commitment to those specific items, even if we find we need to pivot along the way. This problem is exacerbated when the roadmap becomes a project plan with specific features called out far in advance and commitments to them made with dates. See this article for more about keeping a product mindset.

    A roadmap is not a list of features or requirements. A roadmap should be strategic. It should be focused on the vision and direction of the product, and the problems we’re solving. It is about the value we’re delivering, not necessarily the features. While it certainly is okay to talk about features on the roadmap, especially the near-term features that we’re confident in committing too, it’s important to caveat specific features with the understanding that the features are meant to solve a problem or achieve an outcome. We aren’t simply delivering a wish-list of features.

    Key Principles

    Now that we’re clearer on what a roadmap is and isn’t, what can be done? How can we craft roadmaps that fulfill the needs of users and stakeholders while still allowing us to learn and iterate along the way?

    No two roadmaps need to necessarily be the same. And I won’t advocate for any specific template over another here. I’ve used variety of different types of roadmaps and they all have benefits and drawbacks. There are a few key principles that are true of most roadmaps.

    1. Focus on Outcomes: As mentioned above, the key purpose of a roadmap is to convey the benefits and outcomes of our product development. So any roadmap we create should focus on the value we’re providing and how we can measure it.
    2. Understand the Audience: You will likely have a variety of groups interested in your roadmap. Each audience may need different things. Executives may be more interested in financial implications of the product development while customer support needs to know what new things are coming so they can be prepared for questions. This may entail tailoring the details of the roadmap to the audience (though I’d avoid maintaining completely separate roadmaps and just focus on different things for different groups where possible).
    3. Keep it Clean: Don’t get too bogged down in details in the roadmap. As mentioned above, it’s not the place for the project plan. It’s not the place for extensive details. They will only confuse users and stakeholders and raise lots of questions. It’s about the shared understanding. Stakeholders who are intent on getting into details can refer to the project plans or backlogs if necessary, as part of a separate conversation.
    4. Convey the Vision: Ultimately the roadmap is about telling the story of your product and getting alignment on the direction. Make sure that it is a cohesive narrative. Often this can be done in a simple, visual format. But in other cases having a longer form narrative may be appropriate.
    5. Keep it Updated: Since the roadmap is a living document, make sure that it stays updated. There is no quicker way to lose the value of the roadmap than to let it become stale. If it is going to be the vision and direction of the product, make sure that it stays that way and that everyone is continually bought into that direction, especially as changes happen.

    An Example

    What I have done with my roadmaps, and what (fortunately) seems to be becoming more and more common, is something like below (this is very simplified, but has the key ingredients):

    One of the key features is the focus on themes. This has been critical in aligning the product team behind a common goal. It’s also incredibly useful for discussion and alignment. When we introduce the themes, it opens the door for discussion around the possibilities. For example, if the goal is to launch to a new group of users, the themes may be focused around the key items needed for that group to successfully adopt. Knowing that this new group of users needs the ability to create portfolios then becomes a theme, with potential features or ideas that we can implement in order to make that happen.

    The exciting thing about this structure is that it doesn’t tie us down to any specific path initially. The goal is clear and the metrics are clear, but how we get there is open for discovery and experimentation. We aren’t tied to a specific feature if that’s not the best way to solve the problem. In the case of portfolios I mentioned above, the solutions may involve building that functionality, integrating with other applications, or finding some other way to fulfill that need for the user. A portfolio may not be the right answer at all, which is why we do discovery around the theme.

    Of course, as we get further down the road, our level of specificity decreases. We simply can’t know a year in advance what the solution to those problems will be. Or even what the most important opportunities will be at that time. We can certainly have some ideas and don’t need to be afraid to share them, but we can’t tie ourselves down to a particular course so far in advance.

    A good roadmap helps paint the vision and strategy for the product. It outlines the key goals, often by quarter, and shows themes or opportunities that the team will be focused on.

    If you’re interested in diving deeper into roadmaps and alternatives to the way roadmaps have been done for a long time, I’d highly suggest Product Roadmaps Relaunched, which has a lot of great tips on better ways of doing roadmaps.


    Ultimately a roadmap is about creating a shared understanding with our team, our users, and our stakeholders. It is not about creating a document in a specific format or with specific pieces. Part of that shared understanding needs to be that we will learn and iterate as we go. We’re focused on solving problems, not releasing features. And while we may have talked earlier about a specific feature, if we can find better ways to solve problems and deliver value, many of the specifics may change as we go. Our roadmap is meant to help facilitate that understanding between groups and ensure alignment. It is about the vision and the value of what we’re delivering. So hopefully more roadmaps can become helpers, rather than hindrances, in getting us to those end-goals. Roadmaps can be a critical tool for progress in product development. Even if we have a love/hate (& hate) relationship with them sometimes.


    每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,欢迎关注开源日报。交流QQ群:202790710;微博:https://weibo.com/openingsource;电报群 https://t.me/OpeningSourceOrg

  • 2018年12月1日:开源日报第268期

    1 12 月, 2018

    每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,欢迎关注开源日报。交流QQ群:202790710;微博:https://weibo.com/openingsource;电报群 https://t.me/OpeningSourceOrg

    1


    今日推荐开源项目:《蓝猫淘气五百问 DeepLearning-500-questions》传送门:GitHub链接

    推荐理由:对深度学习有些不懂的地方想要提问?这个项目就是对深度学习进行了介绍——以各种问题的形式。通过对各种不同的问题进行解答来让阅读者了解深度学习的相关内容,从最简单的各种基础到现在流行的 NLP(虽然还在完善中)都有涉及,兴许你在寻找相关问题的时候,可能会大吃一惊:“这个问题刚好是我想问的,惊了!”


    今日推荐英文原文:《Understand your program’s memory》作者:Tiago Antunes

    原文链接:https://medium.com/@tm.antunes/understand-your-programs-memory-92431fa8c6b

    推荐理由:了解你的程序的内存,如果你第一门编程语言选了个 C 或者 C++ 的话你大概已经被内存问题针对过好几次了,这篇文章就介绍了应用程序是如何分配内存的,主要是介绍堆栈和堆,兴许能够减少你再次被这种问题所烦扰的机率

    Understand your program’s memory

    When coding in a language like C or C++ where you can interact with your memory in a more low-level way, sometimes it creates a lot of problems you didn’t get before: segfaults. These errors are rather annoying, and can cause you a lot of trouble and are often indicators that you’re using memory you shouldn’t use.

    One of the most common problems is accessing memory that has already been free’d — memory that you’ve either released with free or memory that your program has automatically released (from the stack for example).

    Understanding all this is really simple and it will definitely make you program better and in a smarter way.

    How is the memory divided

    High stands for high addresses

    Memory is divided in multiple segments, two of the most important ones (for this post) are the stack and heap. The stack is an ordered insertion place while the heap is all random — you allocate memory wherever you can.

    Stack memory has a set of ways and operations for its work (it’s where some of your processor’s registers information gets saved) and it’s where relevant information about your program goes — which functions are called, what variables you created, and some more information. This memory is also managed by the program and NOT by the developer.

    The heap is often used to allocate big amounts of memory that is supposed to exist as long as the developer wants. That said, it’s the developer’s job to control the usage of the memory on the heap. When building complex programs, you often need to allocate big chunks of memory, and that’s where you use the heap. We call this Dynamic Memory.

    You’re placing things on the Heap every time you use malloc to allocate memory for something. Any other call that goes like int i; is stack memory. Knowing this is really important so that you can easily find errors in your program and futher improve your Segfault error search!

    Understanding the stack

    Although you don’t know about it, your program is constantly allocating stack memory for it to work. Every local variable and every function you call goes there. With this, you can do a lot of things — most of them are things that you did not want to happen — like buffer overflows, accessing incorrect memory, etc.

    So how does it really work?
    The stack is a LIFO (Last-In-First-Out) data structure, which you can image as a box of perfectly fitted books — the last book you place is the first one you take out. By using this structure, the program can easily manage all its operations and scopes by using 2 simple operations: push and pop. These 2 do exactly the opposite of each other: push inserts the value to the top of the stack while pop takes the top value from it.

    Push and Pop operations

    To keep track of the current memory place, there is a special processor register called Stack Pointer. Every time you need to save something (a variable or the return address from a function), it pushes and moves the stack pointer up. Every time you exit from a function, it pops everything from the stack pointer until the saved return address from the function. It’s simple!

    To test if you understood, let’s use the following example (try and find the bug alone ☺️):

    Everything looks ok — until you run it

    If you run it, the program will simply segfault. Why does this happen? Everything looks in place! Except about… the stack.

    When we call the function createArray the stack saves the return address, creates arr in stack memory and returns it (an array is simply a pointer to a memory location with its information) but since we didn’t use malloc it gets saved in stack memory. After we return the pointer, since we don’t have any control over stack operations, the program pops the info from the stack and uses it as it needs. When we try to fill in the array after we returned from the function, we corrupt the memory — making the program segfault.

    Understanding the heap

    In opposition to the stack, the heap is what you use when you want to something to exist for some time independently of functions and scopes. To use this memory, C language stdlib is really good as it brings two awesome functions: malloc and free .

    Malloc (memory allocation) requests the system for the amount of memory that was asked for, and returns a pointer to the starting address. Free tells the system that the memory we asked for is no longer needed and can be used for other tasks. Looks really simple — as long as you avoid mistakes.

    Since the system can’t overwrite what develpers asked for, it depends on us, humans, to manage it with the 2 functions above. This opens the door for one human error: Memory Leaks.

    Memory Leak is memory that was requested by the user that was never free’d when the program ended or that pointers to its locations were lost, making the program use much more memory than what it was supposed to. To avoid this, every time we don’t need an heap allocated element anymore, we free it.

    Pointers: bad vs good

    In the picture above, in the bad way never free the memory we used. This ends up in wasting 20 * 4 bytes (int size in 64-bit) = 80 bytes. This might not look that much, but imagine not doing this in a giant program. We can end up wasting gigabytes!

    Managing your heap memory is essential to make your programs be memory efficient. But you also need to be careful on how you use it. Just like in stack memory, after the memory is free’d, accessing it or using it might cause you a segfault.

    Bonus: Structs and the heap

    One of the common mistakes when using structs is to just free the struct — which is fine, as long as we didn’t allocate memory to pointers inside the struct. If memory is allocated to pointers inside the struct, we need to first free them and only after free the entire struct.

    Look at how I used free

    How I solve my memory leaks problems

    Most of the time I program in C I’m using structs, therefore I always have 2 mandatory functions to use with my structs: the constructor, and the destructor. These 2 functions are the only ones where I use mallocs and frees on the struct, making it really simple and easy to solve my memory leaks (If you would like to know more about making code easier to read, check my post on abstraction).

    A way to create, and a way to destroy!

    Don’t forget to follow me!

    Besides posting here on Medium, I’m also on Twitter.

    If you have any questions or suggestions, don’t hesitate to contact me!


    每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,欢迎关注开源日报。交流QQ群:202790710;微博:https://weibo.com/openingsource;电报群 https://t.me/OpeningSourceOrg

  • 2018年11月30日:开源日报第267期

    30 11 月, 2018

    每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,欢迎关注开源日报。交流QQ群:202790710;微博:https://weibo.com/openingsource;电报群 https://t.me/OpeningSourceOrg


    今日推荐开源项目:《软件工程技术面试个人指南 interviews》传送门:GitHub链接

    推荐理由:准备面试的时候肯定用得上的资源合集,重点在数据结构与算法方面,各种数据结构与算法时间复杂度的相关知识都记在了里面,实际上除了面试前,平时学习中来了解这个巩固知识也未尝不可。另外它还提供了一些在线面试编程的网站,在有时间的时候再尝试这个吧。


    今日推荐英文原文:《10 Bad Habits To Avoid As A Developer》作者:Brad Traversy

    原文链接:https://medium.com/@traversymedia/10-bad-habits-to-avoid-as-a-developer-64a1677c60fe

    推荐理由:对于开发者来说 10 个常见的坏习惯,检查一下自己是不是也有这些坏习惯吧,尽早改掉它们会让你的工作更顺利

    10 Bad Habits To Avoid As A Developer

    Every developer “develops” some bad habits throughout their career or even their learning experience. In this article we’ll take a look at some of the common bad habits that I have experienced myself and/or have seen over and over. My hope is that if your just starting out, you can avoid this stuff and if you are having these habits, your aware and you can start to work on changing them.

    #1 Not Taking Enough Breaks

    So the first one, I’m sure many or all of you are guilty of. I’m still guilty of it and that’s not taking breaks or not taking enough breaks. I’ve had periods of time where I’ve sat down at 6am and maybe only got up for lunch around 1 and then gone until 6 or 7 at night, and this was common, almost every day. I’ve done much more ridiculous things when I was on a time crunch. I think we we all have had those rare occasions when we need something done the very next day, that is not really what I’m talking about, I’m talking about your everyday habits.

    I would suggest that each day you try and take frequent breaks. I can’t say a specific plan for everyone cause everyone’s different, but in a general sense I’d say around every hour get up and stretch your legs walk around, get a coffee, get something to eat. A lot of times, if your stuck and you take a break and come back to it the solution will come easier after giving your brain a rest. So figure out what works for you. Even if you don’t think you need breaks, just try it, you may find that your more productive.

    #2 Refusing To Ask For Help

    Number 2 applies to both learning and in the actual workplace. Many of us don’t ask for help. It could be for a number of reasons but I think a big one is pride and the fear of looking like you don’t know what your doing. Many of us have impostor syndrome where we don’t feel fully qualified in our positions. I’ve felt like this both in a company setting and dealing directly with clients. And even doing courses and tutorials. So asking for help just re-affirms that feeling. But in reality, its wasting a lot of time and hindering your growth. Other real developers are just as much of a resource as a video or book. I’d say even better than that stuff. They can directly answer your question and help you really understand it. The only people that would criticize you for asking for help would be a complete asshole and Id try to avoid those people anyway. If you don’t wanna ask for help because you want the experience of finding the answer on your own that’s fine, but give yourself a time limit. Don’t go days searching for a solution when you have peer right next to you that may know or can at least help you out

    #3 When You Stop Being A Student

    I don’t care if you’ve been a senior developer for 20 years, you should always think of yourself as a student. More so than most professions because this one is always changing. No developer knows everything about anything. The minute they do, something changes and they still have to learn more. If you get complacent and you stop reading and learning, you’ll fall behind. Even if you have a job that doesn’t require you to learn anything new, like lets say you build the same type of projects with the same software, same version and everything, if you loose that job which is always a possibility, your gonna be way behind. So even with a job like that, id still suggest learning new stuff on the side. Stay up to date with whatever language, frameworks, libraries that your into. There are a lot of jobs like I just explained and its understandable because many team leaders at companies figure if it ain’t broke don’t fix it. So you still see teams using outdated and unsupported technologies because it seems to be working. If your learning new stuff on the side and you can show your team that its possible to make your projects faster and more efficient and easier, you may be able to sway them into updating their technology and bettering the company.

    #4 Dirty Code

    This is more of a technical habit and this could be a lot of things. You want to write your code in a way where its visually clean, efficient and secure. This is really hard when your self taught because a lot of the times in tutorials and courses, your not learning the best way to do something because the instructor is trying to make it easy to understand the core concept. So you have to kind of do some extra research and figure out the best way possible to clean up your code. Id definitely suggest always using the DRY principle which is don’t repeat yourself. If you see common blocks of code, create some kind of class or function to consolidate that piece of functionality rather than just repeating it. It makes it much cleaner, saves a bunch of lines and its easier for others to work with. You also wanna pay attention to performance. Do things like compress images, minify JavaScript and CSS. You can use a task runner like gulp or many other tools to do this automatically or if its a small project you can even do it manually with something like minifier.org. Also don’t make unnecessary api calls, structure your full stack app in a way where you can make as little requests as possible and still get the functionality you need. Also testing..This is one I’m a huge culprit of. I don’t do enough testing. As much as I know things like unit testing helps build a more robust app and saves you on potential issues, I just frigging hate it. Its probably one of my worst habits and something I need to work on to be a better developer. Sometimes we cut corners to save time but in reality, were making the application less performant, less efficient, less readable and it will probably cause more of a headache in the future than if you just did it the right way do begin with. So try and keep that in mind.

    #5 Bad Work/Life Balance

    This is really important, especially if we have families at home and that’s work/life balance. Being a programmer of any kind takes up loads of time. There’s many reasons for this, things are always changing, we run into issues that can hold us up, we need to research and the list goes on. In turn, a lot of the time, we have to work late, work early, work on the weekends or all 3. This takes time away from everything else in your life including spending time with your loved ones as well as anything else you like to do. You may like sports, hiking, going out to eat, whatever it is, and if you’re constantly working you aren’t doing anything else that makes you happy. This is an area I have a lot of experience with. I have a wife and 2 kids, one with autism and I don’t spend the amount of time with them that I’d like to. I have kind of a double whammy because I have all of the issues of dealing with coding as well as the issues of a content creator and having to constantly come up with new ideas and recording and quality and so on. And if any of you guys are freelancers and work for yourself, you know your livelihood depends on getting work done. You only get paid if your getting shit done. As rewarding as working for yourself can be, it’s a constant worry about keeping up and getting things done. It’s really easy to fall off and I think that weighs on us and pushes other things out of our lives. Not to say that people that work for companies don’t go through this but its a whole new level when everything falls on you. So I really empathize with those of you that have your own businesses. But even with that said, you can’t let it control your life. You have to make time for your family and friends and quite frankly, for yourself. Life shouldn’t be just about writing lines of code. Do things you enjoy that bring a good balance to your life.

    #6 Bad Office Politics

    This next one is for those of you working at a company. You work with other people which in turn can cause conflict, disagreement, arguments and so on. Many developers are arrogant and always wanna be right. Even if they know they made a mistake and they’re wrong, some of them would never admit it. I’m not saying that’s most developers but I think we’ve all met at least one of these guys. I hear from a lot of people that their team is great and they all get along and that’s really good but it’s not always the case. Many times you’re gonna clash on ideas and solutions. Try and be diplomatic and respectful but at the same time, don’t be a pushover, especially if you feel strong about whatever it is you’re proposing. Don’t resort to yelling or name calling or any of that. It doesn’t get you anywhere. If they start doing that to you, just walk away and be the bigger person. Unfortunately, if you have someone on your team that is just a complete dick and won’t listen to reason, there’s really nothing you can do aside from try to avoid them. There may be some cases where you have to talk to someone that is higher up. I would always suggest talking to the person first though.

    #7 Not Learning From Mistakes

    So being a developer, you’re going to make a ton of mistakes. It’s inevitable and there’s nothing wrong with that. There is a problem if you keep making the same mistakes and you don’t learn from them. The process I would suggest when you make a mistake is to figure out what the ultimate cause of the mistake was, figure out if there could a process be put in place to prevent it from happening again and then figure out if the mistake had been found sooner could you have prevented the consequences? If you think about these 3 things when you make a fairly big mistake, chances are it won’t happen again or at least you’ll catch it sooner. Also, don’t be too hard on yourself for making mistakes. It happens to the best of us.

    #8 Giving Up Too Soon

    Frustration is a huge part of programming. I’ve made a couple videos on frustration and dealing with some of the issues that arise in both projects and learning. I’ve seen many people give up too soon in both specific projects and on programming in general due to frustration. Some projects are really difficult and it seems once you fix something it causes another thing to break and it just keeps happening. You may start to think you’re in over your head, you could be doing something else, you’re loosing money and many other negative thoughts. If you give up to soon though and you scrap the project or you quit your job, then everything you put into that project or job was for nothing. I’m not saying there aren’t projects that should be given up on but I’ve seen it many times where people have given up and from an outsiders point of view I could tell if they stuck with it for just a little longer, it probably would have been successful. So before you give up on anything, make sure you’ve exhausted all routes. You’ve searched up and down, asked for help, started over trying something different, maybe using a different technology, taken a long break to get your thoughts back in order, maybe even putting it to the side for a bit if possible. You want to do absolutely everything you can before quitting. If you still are failing, then maybe it is time to move on, but all avenues should be taken before that happens. Success could be right around the corner and it would be a shame if you gave up just before that turn.

    #9 Being A Know It All

    So I talked a little about arrogant developers earlier and I think what makes many of them arrogant is that they think they know it all. They don’t listen to other developers because why would they, they already have all the answers. Being this way sucks for the people that are around you and it also hurts yourself because if you think you know it all, your not actively learning more and bettering yourself and I guarantee you’ll have a horrible wake up call someday when something goes really wrong because you failed to listen to anyone else and or do your research. Most of these guys are the trolls on Stack Overflow that will make fun of a new developer asking a question or make fun of someone else’s answer, down voting every chance they get. I have a deep annoyance for these people. I think many of them got picked on in school and they use their knowledge to now pick on other developers that may be having issues or aren’t getting something. They seem to forget how it felt for them to be picked on and want revenge. I could be wrong but that’s my theory. Regardless of why they do it, I think that if they were more open minded and welcomed in the ideas of others and respected others, they would be much happier than just always trying to be right. They could be the smartest person on a team but also the worst person on the team, because nobody wants to work with them and there’s no good communication going on. For a team to be successful, there needs to be communication and unity and being a know it all, just destroys that. So if this is you, try and take the stick out of your ass and be a bit more open minded and more respectful, you’ll go further in life.

    #10 Not Taking Constructive Criticism

    Ok, so number 10 is sort of related to the last one and it’s not being able to take constructive criticism. There’s a big difference between a know it all troll and someone that is genuinely trying to help you. Sometimes it’s hard to see the difference because having someone point something out to you that you did wrong or you could’ve done better, doesn’t feel good and may feel like an attack but a lot of the time it’s not, it’s just someone that is showing you a better way or just sharing an opinion. It took me a while as a content creator to figure out the difference of who is trolling and who is helping. At first I found myself being defensive to anyone that said anything about how I did something. But I realized that many of these people are legitimately just trying to help. If they aren’t being disrespectful or just nit picky over something that doesn’t really matter and is just preference, then I need to take it as something that can benefit me and my knowledge on whatever it is. Constructive criticism is a fantastic resource for learning, and the reason for that is because it’s targeted. It’s something that you are directly having issues with and someone is offering a specific solution. That’s invaluable. In fact code reviews are great because you get other peoples suggestions and influence on your code and how you can improve it and better yourself. So don’t take things personal unless you are actually being attacked or intentionally made fun of and disrespected. It’s hard to hear that you were wrong or you could do better but ultimately it’s going to make you a better developer.

    I hope this advice helps some of you who are both new to development as well as seasoned developers.


    每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,欢迎关注开源日报。交流QQ群:202790710;微博:https://weibo.com/openingsource;电报群 https://t.me/OpeningSourceOrg

  • 2018年11月29日:开源日报第266期

    29 11 月, 2018

    每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,欢迎关注开源日报。交流QQ群:202790710;微博:https://weibo.com/openingsource;电报群 https://t.me/OpeningSourceOrg


    今日推荐开源项目:《开源指南 opensource.guide》传送门:GitHub链接

    推荐理由:想要为某个开源项目贡献一份力?亦或者是自己有个好点子想要开始一个开源项目?如果你不知道从何做起的话,就应该来看一看这个开源指南了。这里面记录了你在运行和贡献开源项目时用得上的资料,包括了从开始贡献或建立开源项目这些基础方面到从项目中获利这些以后可能接触到的内容,总而言之,如果你还不够熟悉这方面的知识,在开始你的行动之前确认一遍这份指南总是没错的。


    今日推荐英文原文:《How to Become a Better Software Developer》作者:Pavels

    原文链接:https://medium.com/devtrailsio/how-to-become-a-better-software-developer-dd16072c974e

    推荐理由:如何成为好的软件开发人员的指南,这个指南并不是针对某种技术上的开发人员,而是对工作方式和一些为人处事的方式提供建议

    How to Become a Better Software Developer

    Today I would like to share some thoughts on ways a software developer can improve his professional skills and become better at their work. The topics raised here are universal and not specific to any technology stack. Most of them are not even specific to IT, for that matter. These are general advice on how to develop your personal traits, improve collaboration with colleagues and clients, and advance your career as a software developer.

    Some of the things in this article are subjective and reflect my personal experience, while others have been adopted and successfully used by others.

    Understand the Process End to End

    A lot of developers think that software development is all about coding, and everything else is just people trying to be annoying and wasting their precious time. This cannot be further away from the truth. Before you get to code a piece of software, it undergoes a process of transformation from a vague idea into a carefully designed solution ready for implementation. And after you pushed your latest changes into Git the software is being tested, deployed, monitored, analyzed and improved on. Coding is just one of the many steps of the process.

    So why does this happen? Frequently, especially when working in larger organizations, different phases of the projects are handled by different teams or even departments. It all starts with the business analysts, who gather requirements. The requirements are then handed over to the designers that produce the mockups for developers. The developers code away and give the results to the QA engineers. If everything is OK, the artifact is sent to the operations teams that deliver it to the end users. This process is treated as a set of discrete steps without any feedback. Because of the lack of communication between the departments, their representatives often don’t really understand the goals of others and this leads to misunderstandings and even conflicts.

    Often the process of software development is treated as a set of discrete steps with no feedback.

    For many people nowadays this might sound too exaggerated. With the rise of agile methodologies, more companies move away from such a rigid approach towards smaller teams consisting of people of mixed specialty. But even then we see that people don’t really try to understand the work of others. How often have you been irritated with your designers because they want you to implement a custom checkbox that is just too time-consuming? And vice-versa, received criticism, because you forgot to use the correct font.

    A lot of these differences can be overcome by just paying attention to the work of others. Sit down with your designer and explain him, that implementing a custom checkbox takes a while and that there’s a library that offers a different similar checkbox you could reuse. In return, learn the basics of typography and understand why choosing a correct font makes a difference. Develop the same attitudes toward managers, business analysts, QA engineers, support and marketing specialists. Quoting T. Huxley:

    Try to learn something about everything and everything about something.

    By learning something from everybody, you will be able to anticipate their needs, shorten the feedback loop and enable more frequent deliveries. Plus it will earn you a lot of love and respect from everybody else.

    Understand Your Client’s Needs

    There’s one important thing that you need to understand about your customers: they don’t understand most of the stuff that you’re doing. Agile, functional programming or non-relational databases is all dark wizardry to them. Even the ones that closely follow your work and are genuinely interested are still mostly in the dark. This has a couple of consequences.

    The face of most clients when talking to software developers.

    Hiring software developers for them requires a certain degree of trust. People often tend to feel uncomfortable about having to pay a lot of money for something they don’t understand. Remember last time you walked into an unfamiliar car repair service and weren’t sure if you could trust them with your ride? Well, your clients have the same feeling. Except there’s no car, there’s just a whole bunch of abstract non-tangible concepts which are supposed to somehow materialize into products and revenue. When working with new clients it’s important to earn their trust. Make sure they understand how you operate and aim to deliver results in smaller but frequent iterations. That way they can see the progress of your work, assess the intermediate results and provide their feedback.

    Often clients tend to come up with their own solutions instead of sharing their problems. Since they have little idea of your capabilities, their solutions are often misjudged, under- or overambitious. Remember the old (and maybe fictional) quote by Henry Ford:

    If I had asked people what they wanted, they would have said faster horses.

    Instead of going with the flow and silently implementing whatever the client wants, it’s sometimes useful to invite them to take a step back and discuss the problem that they wanted to solve in the first place. When combining their domain knowledge and your technical expertise, you’re are likely to arrive at a better solution.

    Keep in mind, that not everybody likes having their ideas questioned and this tactic requires you to have some tact and inspire confidence in the client’s eyes. You will also need to leave your comfort zone and immerse yourself in their business, to be able to understand the problem and suggest a better solution. This can be challenging if you’re are working in complex industries such as finance or health care. But if you pull this off once, it’s likely that next time the client will return with a more open mind.

    Pick the Right Tools for the Job

    If all you have is a hammer, everything looks like a nail.

    Often developers that learn only a single technology rush to apply it to every problem they encounter. Unsurprisingly, this kind of approach leads to sub-optimal results. Instead, when tackling a new problem, pause and think whether the tools at your disposal are really suitable for this kind of work. If you have doubts, investigate a bit and come up with a list of likely superior alternatives. To make it easier, compile a list of questions and assess different options one by one. The questions can be different for each assessment, but it can go along the way of:

    • What platforms or devices must it support?
    • What are the non-functional requirements, such as performance or memory usage?
    • Is buying a license an option, or do you need something free or open-source?
    • Does the solution provide everything you need out of the box, or will you need to write something yourself?
    • Do you have any other limitation, like company policies, legal considerations or a lack of specialists in your team?

    Answering these questions should help you structure the options in your head and narrow them down to a shortlist of candidates.

    Experiment Safely

    So what happens if you none of the things you know are a particularly good fit in your case and you want to try something new? The fact that you don’t experience with something doesn’t automatically mean that it’s out of the question. It just means that you need to consider some additional things:

    • Do you have enough time for preparation? If the timeline of the project is not stressful, you can learn as much as possible before you begin the implementation and pick up the rest along the way. Or at least adopt the “fake it till you make it” approach and convince the client that you know what you’re doing.
    • Identify the things you need to test first. Take the “fail fast” approach and identify the crucial things that you need to evaluate before you can conclude the experiment. Having doubts about the performance of a system? Build a minimal prototype and run a load test. Uncertain about a particular library or integration with an external service? Implement that separately and then build the rest.

    Keep in mind that going down this road is still risky both for you and your client, and they need to be aware of both the risks and the potential benefits. After all, a two-week investigation that might save months of work in the long run, this sounds like a pretty good deal. Even if the experiment fails, you only lose two weeks. The more trust you have with your client, the more they are likely to agree to something like this.

    Build on the Shoulders of Giants

    Reinventing the bicycle often leads to weird results.

    IT people often have two common characteristics: we are inventive and we enjoy our work. This sounds like a good thing, but it comes with an awkward side-effect: we tend to come up with our own solutions to problems that have been solved before. So whenever we’re faced with a choice of whether to use a framework, library or service or to implement it on our own, we tend to choose the latter. And this takes us on the futile journey of reinventing the wheel. Some of the common misbeliefs that lead to this are:

    • Implementing something yourself is easier than learning a 3rd party solution. While this may be a perfectly valid reason, it’s important not to oversimplify the task at hand. Often, something seems simple in the beginning but turns out to be much more difficult with progress. Eventually, you could end up spending a whole bunch of time handling bugs and edge cases that someone could have handled for you.
    • This solution does more things than I need. Unless there are specific reasons why this is a bad thing, such as increasing the size of the resulting artifact, adding potential vulnerabilities or considerably slowing down the build, this is not usually a bad thing. You might end up needing it later. On the other hand, adding a whole library to use just one function might be an overkill.
    • We can do it better. Although there are some successful projects that started with these words, this is not usually the case. Quality third part solutions are maintained by teams that have experience and resources devoted to solving this particular problem. To compete with them you need to be able to invest even more. Most projects have neither the resources nor the need to do that.
    • Code ownership and long-term maintenance will become a problem.Some people fear that if you go with a third party solution, you risk that the project at some point might become abandoned or unusable for whatever reason. The risk of product lock-in is real, and you should consider a possible mitigation strategy. If it’s an open-source project, would it be possible for you to fork it and maintain by yourself? Or if it’s a proprietary project, how much would it cost to replace it? Based on these inputs you can make a conscious decision on whether it’s worth the risk.

    Learn Through Reimplementing

    There’s another side to this story. Reimplementing something yourselves is actually a great way to learn. While writing your own framework for a production project is almost always a bad idea, creating it as a learning exercise can be highly valuable. What better way to familiarize yourself with the problems that it solves by taking a crack at the same problems. Don’t go too deep into the rabbit hole, a simplified crude implementation will be enough to give you an understanding of the situation.

    While you’re at it, don’t shy away from peeking into the sources of similar projects. Studying the code of open-source projects will allow you to benefit from the experience of more seasoned developers.

    Work on How You Work

    Strive for improvements not just in technological aspects, but in methodological as well. Just like properly designed and optimized software, a well-established workflow will allow you to work with fewer effort and stress while producing better results. Establishing an effective and efficient work process is not an easy task and there are numerous books and materials available on this topic. But for a start, consider the following areas for improvements:

    • Team and project management methodologies. Since most of us work in teams, it’s important to adopt a process that improves collaboration and establishes a common work rhythm for everybody. The agile movement in software development has given birth to a number of widely adopted methodologies, such as Scrum or Kanban. They help organize the overall work structure but don’t cover everything. There are other methodologies that help you make estimates, prioritize issues, improve communication, etc. You’ll need to identify the areas you are struggling with and look for best practices that help address your struggles.
    • Personal processes. Like an orchestra, an effective team must have the same rhythm, but it doesn’t mean that everybody must work in an identical manner. Each person has their own preferences and should work in a way that makes them more productive. For example, a lot of people don’t like to be disturbed for hours when coding, but I, personally, like to work in short one-two hour bursts with breaks in between (a less strict version of the pomodoro technique). I also don’t like to work at home to avoid household-related distractions and prefer to work from an office or a cafe. Find out what works for you and stick to it, but also make sure that your habits don’t create problems for other team members.
    • Engineering practices. A lot of practices lie on the border between technology and methodology and focus on improving the actual development process. For example, test-driven development and behavior-driven development help keep your code base well structured and tested. Code reviews help reduce defects in the code and also spread knowledge in the team. Continuous integration and continuous delivery ensure an easier and safer deployment process. Use these practices in combination with other organizational methodologies to achieve maximum results.

    Remember, that there’s no process that will work for everybody, you need to trial it in your own environment. Also, make sure that you understand the process completely and implement it correctly. Seek advice from teams that have already gone through the process and benefit from their experience. Don’t neglect the software and material tools that will help you to adopt a process. Get a real Kanban board and a modern platform for continuous delivery. Adopting a new process will require effort and can even lead to a short-term loss of productivity. Give it some time and then do an evaluation of whether things have improved.

    Remove obstacles

    A separate thing has to be said on addressing obstacles. It’s a common mistake to neglect small nuisances that might not seem important but can actually have a toxic effect on your work. Is your product designer sitting in a separate room or building? This means that it takes a bit more efforts to come over and have a conversation and some things will not be discussed. Is writing a new test difficult? Then a lot of things will not be tested.

    None of these things are particularly dangerous by themselves, but they tend to pile up and cause serious consequences. And the nasty thing is, that you often don’t notice them until it’s already too late. Especially when there are always more serious perils to address. Remember the fable about the boiling frog and the notion of creeping normality.

    Stay vigilant and fight these things at their roots before they get to you.

    Focus on the Fundamentals

    Fundamental concepts are the building blocks of your career.

    IT is an extremely fast-paced industry. Every week new tools are released into the market. I’ve already mentioned the infamous “JavaScript fatigue” syndrome in my previous post. A lot of developers have been stressed and felt forced to re-evaluate their JS tech stack with each new project and that drove them nuts. Indeed, always being on the edge can be challenging, but there are a couple of ideas that can make it easier.

    First of all, focus on the fundamentals. Even though new technologies appear quite frequently, new fundamental concepts are much more seldom. When learning something new, make sure you understand the underlying ideas that lead to this implementation. Chances are, these ideas are used in other projects as well, and once you encounter something similar, it will be easier for you to get a grasp of it. For example, modern JavaScript UI frameworks are based on components, and once you understand how to structure a component-oriented application using React, can use this experience when working Angular. In a similar manner ideas of Redux found their way into Angular, and reactive state management from Angular was implemented for React as MobX.

    Take some time to familiarize yourself with the classical books on the topics of common patterns in software development such as “Enterprise Integration Patterns” by M. Fowler or the famous “Design Patterns: Elements of Reusable Object-Oriented Software” by the Gang of Four. Although some of the things described in books may be outdated, you can use them to learn how the patterns evolved till today.

    Secondly, don’t rush to learn about every new thing out there. I understand that it’s tempting to follow every new thing that appears on Hacker News, but a lot of these things are just noise. Rather keep an eye out for things that have been circling in the community for some time now and have matured beyond the hype of initial discussions. Don’t give into FOMO. If you pay at least some attention to what’s going on, no important thing will pass unnoticed.

    Bonus Tips

    We’ve already talked about a lot in this article, but there are a few other points I would like to highlight before we wrap up. These few tips are focused more on your personal traits rather than professional, but I still believe that they have a high impact on your work life.

    Share the knowledge

    Often people think that hoarding valuable knowledge will make them indispensable. Having people like this in your team exposes you to the “bus factor” and can put you in a tough spot if such a person were to leave the project. If you are one of these people, consider that in addition to making you indispensable, your expertise also makes you unpromotable and “unvacationable”. You might miss out on other career opportunities in your organization because you are tied up in this role. Instead, share the knowledge with your colleagues, if possible delegate part of your work to them and use this collaboration to build even greater things on top of their work.

    Don’t blame yourself or others

    I remember a long time ago we had an incident in one project that was by my mistake. We’ve managed to recover from the incident quite quickly and I remember the client telling me:

    You don’t judge a team by how they perform when everything goes according to plan, but by how they operate when the shit hits the fan.

    No matter how good you are, sometimes things will go wrong and in such moments it’s important to be able to keep your cool and handle the situation with dignity and mutual respect. After the fire is put out, don’t focus on finding the scapegoat. This won’t help you avoid mistakes in the future, but will spear fear and doubt across the company. Instead, come together with the affected parties and do a common post-mortem. Focus on the things that lead to the problem, figure out why it happened and brainstorm on what you can improve your system or workflow to avoid this problem in the future.

    Don’t be an asshole

    The developer community is a funny thing. On one side we see a lot of driven open-minded people that contribute to the community by working on open-source projects, giving speeches at conferences or writing articles. On the other side, we encounter people that troll new ideas, disrespect newcomers and demonstrate rude behavior to everyone around them. Don’t be one of those people. Be nice and spread the love.

    A lot of professional advice can be summed up with just four words.

    Wrapping it up

    The best thing about our work is that it doesn’t have a limit. There’s are always new roads to travel and dragons to slay. Whether you’re just at the beginning of your journey or an experienced professional, keep these things in mind. They should help you find your way and become a better developer with each step taken.

    Do you have different advice to share with others? Feel free to post it in the comments and start a discussion!


    Are you interested in learning web development or further improving your skills? Check devtrails.io for a collection of helpful guides to help you figure out your way around web development.


    每天推荐一个 GitHub 优质开源项目和一篇精选英文科技或编程文章原文,欢迎关注开源日报。交流QQ群:202790710;微博:https://weibo.com/openingsource;电报群 https://t.me/OpeningSourceOrg

←上一页
1 … 192 193 194 195 196 … 262
下一页→

Proudly powered by WordPress