Text
Speed up your Travis Tests!
In the world of development, testing is a critical part of the process. It basically guarantees that your application is going to act and perform in a particular matter. And as a general rule, the more tests you have the more confidence, you and your client can have that the project works as intended.
Following the rule of more tests equal more confidence, has a drawback; more time spent waiting for your feature tests to pass. Working on a large scale project, it should be no surprise that you can expect to have upwards of 1000-2000+ tests. By following development procedures, where it's required that a pull request to pass travis; could leave your feature hanging around for 30+ minutes! A simple solution for knocking the times down is to consider parallelizing your tests.
Introducing your saviour, Knapsack. A parallelization package for tests that run rspec and cucumber. Running tests in parallel is a quick solution that doesn’t require a ton of code modification, and could reduce your time by a factor of (1/N Matrix Nodes) + setup time.
Before parallelization
After parallelization (½ the amount of time to finish!)
Setting up is a fairly easy process: Start by first including knapsack to your environment
# GemFile group :development, :test do gem "knapsack" end
Next we need to setup your respected test environments Rspec - spec/spec_helper.rb
# spec_helper.rb require "knapsack" # ... the rest of your spec helper file Knapsack::Adapters::RSpecAdapter.bind
Cucumber - feature/support/knapsack.rb
# features/support/knapsack.rb require "knapsack" # CUSTOM_CONFIG_GOES_HERE Knapsack::Adapters::CucumberAdapter.bind
Now we just need to add a single line to the end of your Rakefile
#Rakefile
# ..Rakefile contents Knapsack.load_tasks if defined?(Knapsack)
In this last part we need to do two things. 1. Generate current test report
.travis.yml
script: - "KNAPSACK_GENERATE_REPORT=true bundle exec rspec spec" - "KNAPSACK_GENERATE_REPORT=true bundle exec cucumber features"
Commit this change and allow travis to run. Once travis has finished running, it should have produced a report in the logs:
{
"[spec path]": 35.45293998718262,
"[spec path]": 17.9939227104187, …. }
We’ll need to copy the entire json hash table over into their respective file type names For rspec: knapsack_rspec_report.json
For cucumber: knapsack_cucumber_report.json Place these files into the root directory of your project 2. Parallel travis tests .travis.yml
env: global: - CI_NODE_TOTAL=2 matrix: - CI_NODE_INDEX=0 - CI_NODE_INDEX=1
You should put the CI_NODE_TOTAL to the number of nodes you’re willing use for each instance the tests will require to run. Followed by increasing the matrix list respectively.
3. Cache your gems
Caching your gems could very well save you several minutes on setup time. Especially if you find yourself with gems that require a native build such as Nokogiri that takes several minutes to build.
.travis.yml
cache: - bundler
Finally commit the changes and behold travis as it splits your tests into multiple nodes.
While this is not a replacement for writing quality, quick tests. This is an acceptable solution for times your specs require the use of Javascript / capybara. Some of the observed down sides to parallelization of tests, are times when the development team is committing and merging pull requests, resulting in the queue of travis to grow exponentially. Thus might actually take longer for your feature to fully pass! So use at your own discretion.
~George Karaszi, Software Developer
0 notes
Text
The health of your community
When it comes to describing coworking, many times coworking spaces like to talk about the value of their community. I mean, yes, guilty! But how does one measure the health of one’s community? Many community managers talk a big game about how interconnected their community is, but what does that actually mean? How is it achieved? How do you know when it’s working?
I’ve taken a lot of meetings lately that have started with “How do I get more members?” Or, “How do I get people talking to each other?” I always say that you just need to give people a reason to gather. Establishing regular events in which all of your members can participate is super important. Even having the courage to follow through with them for the next time when only a handful of people show up. Reminding people why they’re here and personally inviting people to spend time with one another reminds people that it’s okay to join in. By making your invitations personal and genuine, you’re able to establish friendships and trust. Help people realize that their voices matter and that they’re important. The only way to truly have a connected community is by putting in the work and keeping things consistent. If I’ve had a conversation with you about community building, I know I’ve mentioned this to you. It’s the key.
Engaging and connecting in-person:
Every once in awhile, I feel myself becoming a bit out of touch. Usually, it’s during a busy season when I have a lot of administrative work to take care of or even when I have some deadlines to hit. I find myself holed up and tuned into music to get some heads down time. Those days are great for making progress, but there’s definitely a balance to strike between heads down work and tummling.
I find that I’m happiest when I’m able to listen in to some of the stories, learn more about the work members are doing, and connect people with one another who are doing similar or complementary work.
I have to make a painfully conscious decision to pick my head up, join in on conversation, and even sit in a location that lends itself to conversation. It’s a part of my job that I enjoy most, and it’s been refreshing to get back into the soft skilled side of my role and help me reconnect with connecting people. But, everytime I do, I’m happy I took the time.
One of the easiest ways to do this is by personally inviting people to spend time with one another. One of the biggest reasons we have our weekly, monthly, quarterly, and annual rhythms and rituals is so people can expect something to be happening each day they come in. Giving the joy of something to look forward to and the flexibility for something to join in to each day is helpful for planning and for participating.
A note for managers: If your event totally flops, i.e. if only a couple of people show up when you expect a dozen to come, don’t quit. Maybe you could’ve done a better job inviting people, but then again it could have just been an off week. People could’ve been traveling. People could’ve been out for an inexplicable reason. This doesn’t mean they don’t like the idea. It just means that you might need a next time. Keep going.
Engaging and connecting in virtual channels:
I’ve found that a little bit of encouragement to people who share on Slack goes a long way. This is a skill that took time to develop. It takes time to help people feel comfortable with being vulnerable enough to share information, ask questions, and provide feedback. As more people begin to put themselves out there, it encourages a culture for more people to do so.
Of all our Slack channels, our #coding channel is usually the most likely to get a response when a question is posed. Lately, I’ve noticed more participation in other channels and more connections being made in those other areas. For example, just the other day in our #random channel, Leanna asked a question about getting t-shirts printed. Just minutes later, Brian responded to her and emailed her a quote., and her shirts were delivered a few days later. This is just one example in which I see members using Slack to their advantage.
**insert slack convo screenshot
Members have also been using the Google group much more frequently. John is running a business promotion/contest and pinged the rest of the membership to participate. Of course, it’s all an opt-in process, but I’ve seen a bit of back and forth conversation in the group thread. Because I’m friends with most of our members on Facebook, I’ve even seen them promoting John’s business on there as well. Members have been sharing the link and promoting John’s business publicly as well. Though there is a prize of a free coffee at San Chez, I can’t imagine that they’re doing it solely for a beverage. People do these things not because they have to, but because they want to. That’s a beautiful thing.
A note for managers: You can draw attention to this kind of behavior and encourage it by applauding it. The quicker you can do this and the more public you can make it, the better. If you can’t find an opportunity to do this publicly, definitely pull the person aside and mention that they did the right thing. They’ll feel more confident doing it again and might even share that success with another member who similarly wants to share and connect.
Bonding over a common thing:
But it’s not always business as usual. After all, we do like to have some fun. Like, for example, when Jon posted to Slack, asking if anyone had carved an awesome pumpkin for Halloween. :)
**insert screenshot of Halloween convo
Or when we dressed up for Halloween...I mean, check out these emojis.
**insert screenshot of Halloween dress up
Connection over a common thing is the most basic way to explain how relationships are formed. And, with most relationships, it takes a bit of vulnerability to put yourself out there and try something new. It’s new territory to navigate, and with that, it’s a scary thing to do. As managers, I think we sometimes have a difficult time putting ourselves in new members’ shoes and forget what it was like when we were new in our roles. The longevity of our membership shouldn’t dull us to the empathy required to be a friend first.
One of my favorite things to see as a manager is members moving their relationships from inside the space to outside of the space, whether it be for personal or professional gain. I’ve had the pleasure of seeing a lot of friendships and work relationships blossom from people connecting in person and online. In the next part of this series, I’ll be talking about some of the work and collaborations that have come about among members.
~amelie, community manager
#amelie#coworking#community#connect#connectedness#slack#events#rhythms#regularity#tummeling#longevity#friendship#relationship#participation
0 notes
Text
The health of your community (part 2)
In my last blog post, I wrote about the health of our coworking community (link). For a new community manager, one of the largest hurdles to overcome is how to get your community engaged not only with you but with one another. They say character is who you are as a person when nobody is watching. What happens when the community manager isn’t around? Does the community thrive or does it falter? What makes it do these things? What keeps the web connected?
The role cannot solely rely on you to take care of things. You can’t make two people like each other, but you can introduce them! Start there.
Nothing warms my heart more than when these relationships blossom. I enjoy hearing of occasions when members gather together outside of our four walls. It really shows how impactful coworking can be not only for networking and work connections but also for personal sustainability, especially for younger members and those who have recently moved to the area.
Getting together outside of work for fun:
There is a group of women who get together once a month for a rotating dinner and craft night. There are a couple of people who get together for dinner to talk about upskilling every once in awhile - CTO to CTO. There are a couple of guys who get together for game nights. Another couple of people enjoy inviting each other to play golf at their country club. Heck, some of us have even watched eachother’s cats while they’ve gone on vacation.
I say all this not to discount when people begin working together. That is a truly special moment that I’ve been proud to witness time and time again. Of course, it’s one of the larger reasons why people decide to join coworking communities in the first place. Lke forming friendships, forming business relationships takes trust.
Eventually working together:
Tyler Wiewiora of Westbound Productions shot a commercial for Nick Mortimer’s Raw Wood Shades IndieGoGo campaign. Shortly after starting her own marketing consulting business, Megan Huxhold has begun contracting work for Biddy Murphy. When Rapid Development Group became overwhelmed with work, they reached out to Joel Bouwkamp, who had recently transitioned into a freelance developer, for help with a client project. After Ellen Doornbos finished up her Programming bootcamp with General Assembly, she was hired as a junior developer with Rapid Development Group. Stuart Pearman volunteered his time to work on an animation for Kendell Joseph’s Art Prize project. Carrie McCulloch has worked with Brian Szubinski to take care of some marketing swag for her events. Marta Johnson has helped Martelle Esposito through the launch of her non-profit, Mothership. Both Kelly Bedore and Amelie Watt have hired Paige Leyh to create custom art pieces for their homes. Kristen Rampe’s accountant has helped the Pelham Weavers transition their business into an s-corp. The list goes on; these are only things that I can recap over the past couple of months.
The community we build and the culture we create is a testament that you don’t join The Factory when you’ve made it. You join The Factory to make it. You join to get work, to make friends, to show up, and to be authentic. We ask for help and give it. You don’t have to take my word for it, though. The health of a coworking space doesn’t have anything to do with your chairs or your shit. It has everything to do with the people and how they contribute to each other’s successes. If you were to stop by and #askamember, we’re confident that they’d agree.
~amelie, community manager
#amelie#coworking#community#tummeling#consultant#better together#friendship#relationship#business#hire#hiring
1 note
·
View note
Text
True Passion
aI spent last Sunday indoors. While I’m usually pretty restless, I welcomed a lazy day and decided to spend the day on the couch. I had recently picked up Big Magic, a book about paying attention to the opportunities inspiration provides us and harnessing them to their full potential, and I figured this would be a perfect day to crack the cover. Little did I know, I’d nearly finish the book in eight hours. In this post, I aim to discuss the ways in which I’ve noticed Big Magic out in the wild and the importance of paying attention to inspiration when it knocks on your door.
In one of the sections, Liz talks about school, her personal relationship with education, and her practice with writing. The largest takeaway from this book, so far, is that of how personal one’s passion is. She writes not because she wants to read but because it’s the thing she must do.
“I don’t know how I feel about it until I’ve had a chance to write about it.”
She talks about her experience of becoming a novelist. Before the large book deals, she works the jobs she does not only to eat but also to gain life experience, the things she can’t get from a book. As a server, she’d keep one notebook for orders and another to keep track of conversations and to track dialects. As a bartender, she did the same. She’d travel and take notes. She’d ride the train and take notes. Over time, she inevitably acquired notebooks full of notes.
As I think about that type of commitment to personal craft, I think about how rare it is to find in the general population. While many of my teammates at the Elevator Up come to mind, the one that sticks out the most is my teammate, Kendell. This guy loves to code, and it’s incredibly impressive. A few months ago, he gave a team time presentation on what it means to find your main sequence, a sort of code by which he lives. Pun intended. In short, if an opportunity comes about, it needs to fit into his lifestyle of being something he can do with his son, something that has to do with space, and/or something related to JavaScript.
<<insert photo of kendell in the office>>
On the other side of the coin, when he’s not working, he’s toying with personal projects. He melds his passion of code and music by way of writing code that controls the lights for his concerts based on the movements made by the musicians’ arm and leg movements by way of MIO devices. (WHAT?!) What’s best is that he shares this information with the world. He’s submitted projects into the world, most recently by way of Art Prize, and regularly collaborates with people in order to do so. He devotes his spare time to teaching people who care about leveling up JavaScript. Whether he’s teaching middle school kids in Austin or adults at a JavaScript meetup, he cares, and it shows.
<<insert photo of kendell at creative mornings>>
I encourage you to give yourself some space. Let yourself play a bit as you did when you were a kid when the stakes weren’t high. If you find yourself enjoying something, like really enjoying something, it could be your big magic opportunity knocking. If it’s truly something you enjoy, you won’t be able to get enough of it. It’ll become part of your identity, and you’ll be living your truth. And that is a truly beautiful and rare thing to find.
Is this you? Does this resonate with you? If it does, I wonder how it does. Do you know anyone like this? Is this you? Can you not get enough of your craft? I want to hear about your passion.
~amelie, product manager
0 notes
Text
Physical and Emotional Dependency
For the first time in my life I had the opportunity to live alone, and I absolutely hated it. Though I have two half brothers, for all intents and purposes, I grew up as an only child. They say that if you’ve got ten years on your siblings, you grew up as an only child. And, well, I’ve got those ten years. And, yes, they make me feel old af.
Growing up as only child was great for a lot of reasons. Of course, the obvious ones included that, for the most part, I had my parents’ full attention. I had a lot of one on one time with them. On the weekends, they’d take me to the park or play sports together. We’d work on homework almost every night together. And, of course, I was exposed to great movies, tv shows, and music.
On the other hand, because I grew up as an only child, I grew up drastically different from many of my friends. Many of them had siblings, so they never felt alone. One very large component of this is kids with siblings were able to spend time around other kids, while I spent most of my time around adults. The only time I was around kids my age was at school.
Going to college was my jam because it felt so good to be around people all the time. I instantly found my stride. From college until about six months ago, I hadn’t ever lived alone, and making this transition into this new mindset was extremely difficult for me.
It felt like my childhood all over again. Being alone made me feel depressed. It conjured feelings that took me to sad, lonely places I didn't care to return to. While I was thankful for the couple of benefits that came along with living alone, like learning how to manage my time, how to become a little more patient, and how to deal with some of the emotional trauma that I had endured, I couldn't shake this incredibly apparent feeling of loneliness.
Part of me thought that I needed to experience time on my own just so that I could say I had. I also felt that by considering getting a roommate that I was giving up my independence. In reality, I learned that none of that mattered. I was lonely. I hated it. Period. And, I learned over time that that’s an okay emotion to feel.
I believe there are two types of loneliness: physical and emotional. I’m sure you’re able to deduce what each of these means. In short, being around other people helped me feel less lonely. When I was at work or out with friends, I felt the best. Of course emotional loneliness comes into play if you don’t have a support system to listen to you and care for your innermost thoughts and feelings. I have people in my life with who I depend on an equal exchange of emotional connection. What I felt most during this time was a physical loneliness. Coming home to an empty house and a cat who hates my guts is enough to make a grown woman cry.
I believe we are all on a sliding scale of emotional and physical dependability. I also believe that while these these scales fluctuate throughout different seasons of life, for the most part they’ll stay relatively consistent. For example, if you’ve spent the last five years of your life preferring a quiet Friday night, and you begin to go out every Friday night, you’re going to eventually feel out of balance and need to revert back to carving out quite time for yourself.
Personally, I know that I need one quiet night at home a week. This night, I’ll catch up on some chores, play some video games, do some work, and maybe get to bed a little early. But, every other night, you can find me with company. I feel invigorated when I’m listening to people, sharing with people, and being around people. And, those things are okay.
Now, I have a housemate, and things are great. We give each other space when we need it and are there for one another when we need it. It’s been working really well, and I feel it filling what was once a very noticeable a void in my life.
Loneliness and isolation rears its head in our lives in many different ways, and it’s one of the biggest drivers for people to come to The Factory. After going through this experience, I understand where they’re coming from much more now than I did before I lived alone.
One of the biggest ways in which people begin to feel this change in their work is when they go through a job transition. It makes sense to feel excited about the next phase of life or the next job. It’s so easy to get caught up in the excitement and forget about the fallout. When a sudden change happens in your work, such as accepting a remote job or going off on your own, it’s easy to forget that you’re going to be alone in your endeavor. Maybe you’ll have a business partner, but it won’t be the same as having a group of coworkers to come to work to each day.
Here at The Factory, we understand that some people need this interaction and that some don’t need it nearly as much. Each person has their own sliding scale of emotional and physical dependability they need to be his/her best self. We’re happy to provide a social and professional hub for people here, and we can’t wait to see how much more connected our community is this year and in the ones to come.
~amelie, community manager
0 notes
Text
Book Summary: Programming Beyond Practices
Programming Beyond Practices is about the higher level thinking that software developers need to be successful. It’s not written like most programming books. It mostly uses second-person narrative so you are the main character in the book. It’s really a collection of short stories that describe many different problems faced by developers, as well as the thought process involved in discovering how to solve them. Reading the book almost feels like learning from a mentor. It’s interesting to read how an expert developer thinks through real-life issues. The book is about critical thinking, problem solving, and soft skills, rather than coding skills.
The following quote from the author sums up the purpose of the book:
“I wrote this book because I believe the shift away from ‘programmer as coding specialist’ is inevitable. If that’s true, then our entire field will need to prepare itself for the not-so-distant future where ‘programmer as skilled solver of ordinary human problems’ becomes the norm.”— Gregory T. Brown
In this book summary, I will summarize each chapter as well as describe key takeaways. The story arc of this book covers a full career in software development so you will observe the main character having more and more responsibility and mastery.
Chapter 1
Summary
This chapter is about exploring new product ideas through rapid prototyping. You work for an agency that helps clients navigate the early stages of product design and project planning.
With a partner, you work on a functional prototype of a music video recommendations system for a client. To get the prototype done, you use principles such as “The Simplest Thing That Could Possibly Work” and the YAGNI principle. This stands for “You aren’t gonna need it” and is a design principle that says functionality should not be added until it’s truly necessary to do so.
After checking assumptions with the client and limiting the scope of the work, a functional prototype is complete by the end of the first day. In the second day, a visual representation of the data used behind-the-scenes is added to the page. This is only temporary and helps the client understand what the program is actually doing.
Takeaways
It is important to ask questions that reveal the goals of all the stakeholders in a project. This helps validate assumptions and help gives clarity to how other people see the problem.
Before worrying about style details, it is a good idea to use wireframes or rough sketches to show the basic structure of an application.
A live test system can be super helpful for collecting feedback from the client. This doesn’t have to be production-ready or use any code that will be in the final product. The important thing is to be able to demonstrate basic functionality and allow people to interact with the product.
Chapter 2
Summary
This chapter is about the many issues that can crop up whenever a production codebase is gradually extended to fit a new purpose.
Your company has an official knowledge base for its product. You’ve been asked to build a public wiki to go along with it that shares the same codebase and infrastructure as the official knowledge base. The wiki you develop is similar to the old knowledge base system, except the wiki is editable by anyone.
After getting the wiki up, you add a sidebar that has lists of articles. This sidebar quickly causes an error. The lists in the sidebar show the last time articles were updated. Some old records had null values for their ‘last updated’ timestamps because they were created before you started tracking update times. This was a hidden dependencies at the data layer.
Part of the sidebar is a list of the five most popular articles. This data will need to be pulled from the site’s analytics service through an API call. But an API call on each page load seems wasteful and would introduce a hard dependency on an external service. You end up creating a script that runs every four hours and pulls the visitor count for each page into the application’s database. Since this code runs outside the main application, a failure won’t be that bad.
There is a problem after the wiki has been live a few months. <script> tags were allowed in the wiki articles and now some articles are being used for nefarious purposes. You reused some code from the knowledge base system on the wiki. The knowledge base was only updated by trusted administrators so allowing <script> tags was fine. The wiki can be updated by anybody. This was another hidden dependency issue.
Takeaways
Always be on the lookout for hidden dependencies even in small updates. Even when existing features are not modified, a change may still break things.
Shared resources from outside your own codebase form a “hidden dependency web” that can cause side effects and failures.
Besides using constraints and validations whenever possible, you should also have good monitoring in place so that unexpected system failures are quickly noticed.
When reusing code and tools, small changes in context can lead to big problems. Make sure to carefully think out any reuse.
Chapter 3
Summary
This chapter is about the various ways that third-party systems can cause failures, as well as how flawed thinking about service integrations can lead to bad decision making.
You run an online educational journal for programmers. You are meeting with your friend for an annual retrospective to discuss some challenges with third-party software integrations.
One major problem had to do with a third-party newsletter service. You didn’t test that much before sending the initial email was because the service was so popular. You assumed a popular service would have no issues. However, your use case of including code in emails was not a common use case. You should always test for and have have a plan for services failing.
The next issue discussed is when the site’s log-in system stopped working all of a sudden. A popular authentication provider was used. The system failed because the application depended on a library that used an old version of the authentication provider API, which was eventually discontinued. As soon as the provider turned off that API, the login feature was completely broken.
No one considered the possibility that the popular API would be discontinued. Also, no careful thought was given to the differences between integrating with a third-party library and a third-party web service. The library will technically work forever but it is dependent upon the web service.
You eventually ran into another issue with the API. The mocks used in the libraries tests were not set up correctly to handle the API’s new schema.
Takeaways
You should never completely trust external services, especially if it is for something other than what it is well known for. It can be helpful to look for examples of others successfully using a service to solve similar problems. This will give you a clue if the service will be a good solution.
While a library can only break things if your codebase changes, an external service can break or change behavior anytime without notice.
When there is a change to a service dependency, make sure to check for old mock objects. You should have some of your tests run against the real services to help prevent misleading test results
You should be constantly evaluating service dependencies.
Chapter 4
Summary
This chapter covers some straightforward tactics for breaking down and solving challenging problems in a methodical fashion.
You are mentoring a friend who is in the early stages of a career in software development. She is good at well-defined tasks but struggles on problems with lots of fine grained details. Coding puzzles can help explore general problem solving techniques so you give your friend a puzzle and help her think through how to solve it.
Here is a list of tips you give your friend as she is solving the puzzle:
The first thing to do is to gather the facts and state them plainly.
Next it can be helpful to work part of the problem by hand before writing code.
The puzzle has input data. It is important to validate the input data before attempting to process it.
Make use of deductive reasoning to check your work
Solve simple problems to understand more difficult ones
Takeaways
Make sense of a problem by writing your own notes, then pair things down until what’s left are the essential details.
Large problems should be broken into simple sub-problems that you already know how to solve. And those sub-problems may be able to be broken down further.
Before coding anything, work through some possible solutions on paper. This allows you to discover how things work together without being bogged down with implementation details.
You should always validate any data before processing it.
Chapter 5
Summary
This chapter shows a step-by-step approach to bottom-up software design, and examines the tradeoffs of this way of working.
You are helping to teach a software design course. To demonstrate where design decisions come from, you are going to lead a class discussion on the process to build a minimal simulation of a just-in-time production workflow. This simulation will include the main steps from a products creations to a customer purchasing the product. In a just-in-time workflow, the customer purchase is what causes everything to happen going back to a new product being created.
You start by having the class identify the nouns and verbs. Words like widget, crate, supplier, order, and produce. Then ask students to put two words together into a sentence. A student suggests to “build a crate and put a widget in it”. So that is where implementation starts.
Beginning with a minimal slice of functionality is helpful when considering a large project. Through discussion, students realize the challenge of designing a system from the bottom up is untangling the connections between objects so that they can be implemented in small slices rather than big chunks.
After implementing some of the relationships, you show the importance of avoiding unnecessary temporal coupling between objects. You also gradually extract reusable parts and protocols. After all the basic components of the system are developed, you experiment by putting them together in new ways.
Takeaways
When using a bottom-up design, start by listing nouns and verbs relating to the problem you are solving. Then create a short meaningful sentence from the words. This sentence can help you determine the first feature to implement.
As your project gets bigger, pay attention to the connections between objects. Think about how to create designs that are more flexible so artificial constraints are not imposed.
If you are going to extract reusable objects and functions, these should be things that will probably not change much over time.
Chapter 6
Summary
This chapter focuses on how small adjustments to the basic building blocks of a data model can fundamentally change how people interact with a system for the better.
You work for a small business that wants to replace a decade-old time tracking application. You are working with the original application developer and are sharing your plan for building a better system.
Your first suggestion is to decouple conceptual modeling from the physical modeling. Instead of modeling work sessions as intervals, you suggest to record punches as individual events and convert the puch data to intervals at the application level.
You also design an explicit model for tracking data changes. Instead of one data model for everything, you suggest using three: punches, puch adjustments, and timesheet revisions. Making changes and understanding previous changes will be easier. This is all about “reducing incidental complexity as much as possible by minimizing mutable state.”
Workflow design and data modeling go hand in hand. You discuss proposed staff workflow to interact with this new data model.
Takeaways
It is better to store data in its raw form instead of trying to get the data also communicate specific concepts. Using this chapter’s example, just store time punches and don’t worry about storing information about the interval. You can process raw data later but it can be challenging to get the correct information from complex models if your requirements change.
Not many projects just involve basic CRUD operations on single records. It is important to think about how data will be presented, queried, and modified over time.
When developing a data model, make sure to think about how to simply communicate the various operations on the data. Users should be able to easily preview, annotate, approve, audit, and revert data changes.
When developing data workflows for an organization, they must work within the current structure and culture of the organization. As Melvin Conway said, “Organizations which design systems are constrained to produce designs which are copies of the communication structures of these organizations.”
Chapter 7
Summary
This chapter is about some common anti-patterns that lead to struggles in software project management, and how incremental process improvements at all levels can alleviate some of those pains.
You are a consultant that is helping a small product company through some growing pains. TagSail is a web application to help people find nearby yard sales. In your first day on-site, there is a minor emergency.
A reverse geocoding API is failing causing all home page request to show a server error. You suggest to temporarily disable the API since it is not core to the sites functionality but an engineer thinks he can fix the problem quickly since he had previously created a proof-of-concept of his proposed fix. Since the proposed fix had never been tested in a realistic environment, you still think it’s better to start with temporarily disabling the API.
The next issue dealt with is that developers are spending half their time working on integrations with other classified networks. These integrations are a service to their customers but don’t bring in additional revenue. After looking at some statistics that show a diminishing rate or return, you suggest limiting how much time developers spend on integrations. This time budgeting helps to limit the impact of high-risk areas on a project.
A few weeks later you visit the company again and discover that reviewing and approving work has become a bottleneck. Developers keep getting more work to keep them busy while they are waiting for various blockers on their tasks. More and more code is being created but hardly anything is being shipped. You get the company to change some processes to solve this issue.
Takeaways
If your entire site is down, disable features to get the site back up as soon as possible. Then repair work can be done without as much pressure.
Use data and calculations to determine areas where you are overcommitted. Set time constraints on how much you work on certain non-essential areas.
It is more important to make sure code gets shipped regularly than make sure everyone is staying busy. Unshipped code is ‘perishable inventory with a cost of carry’.
Chapter 8
Summary
This final chapter has a slightly different format. It contains a futuristic scenario about what programming might be like if we could focus purely on problem solving and communication rather than writing code.
You are preparing a report for a city to help set the budget for sidewalk repairs with the help of your virtual assistant, Robo.
Robo helps a lot in researching and visualizing data. Robo’s research features are like an advanced search engine combined with an organized knowledge base. Humans still need to do the thinking, synthesizing, and creating.
Robo makes things easy and seamless that would normally take a lot of work and trying various libraries and data together. Some operations Robo helps with are matching a geographic coordinate to a region that contains it, exporting data tables from web services, and generating a cumulative flow graph from a table.
The book’s author envisions a time when there will be more and more software abstractions. The ‘programmers’ of the future will be less focused on “rough, low-level, tedious tools” and more focus on the problems themselves and a human-centric outlook.
-Beau Carnes, software developer
0 notes
Text
Awesome software podcasts (with a few obscure gems)
Podcasts are a great way to keep up with what’s going on the software industry. When I was first learning software development, I listened to a bunch of software podcasts. Then I decided to cut back on podcasts so I could have more time without constant mental distraction. 🙂 Lately I’ve been getting back into software podcasts and I want to share with you some podcasts I would recommend.
The New Best Practices
This is a great software podcast out of Grand Rapids! Three experienced software developers discuss the process of creating software.
Software Engineering Daily
This is a daily technical interview about different engineering topics. Guests have come from almost every top tech company. This is the most technical podcast on this list.
Code Newbie / Base.cs
This is the best podcast for people just getting into software development. The Code Newbie podcast features interviews with people on their coding journey. Base.cs is a spin-off series that has beginner-friendly computer science lessons.
freeCodeCamp Podcast
freeCodeCamp has the top technical publication on Medium. This podcast consists mostly of people reading popular articles from the Medium publication. However, there are also some interviews such as this one on machine learning.
ShopTalk Show
In this podcast, two very experience front-end developers (one the co-founder of CodePen) answer listener questions. This is a great way to stay up-to-date with the industry.
The Ruby on Rails Podcast
This show is a weekly conversation about Ruby on Rails. I use Rails a lot at my job so this show is a great way to learn about best practices and what is happening in the world of Rails.
The Rework Podcast
Not a software podcast but still tech-related. This one is created by the company Basecamp. It has stories and unconventional wisdom about running a business.
2 Cent Dad
Another amazing Grand Rapids-based podcast. The topic of this show is intentional fatherhood. This show features interviews with some big names in the tech industry about fatherhood. Past guests include DHH, Alfie Kohn, and more. It is interesting to hear about how high achievers balance work and family.
-Beau Carnes, software developer
0 notes
Text
Sketch, draw, doodle: just do it
Drawing, sketching, doodling: the act of making an idea or thought visual. These are tools we’ve known our whole life and I argue valuable enough to be revisited. Put aside the intimidation of being good at “art”. Forget the preconceived notions that doodling is equivalent to being bored. Rethink how drawing can be used as a tool across all aspects of your team, not just the creatives. ~ Emily, Designer The act of making something visual is a part of every human’s make up since the beginning of time. As children, we constantly created. Meander back to the freeing mindset of early days and forget any notions that only artists draw. Throughout this, I’ll be jumping back and forth between a few methods of making things visual: doodling, sketching, and drawing. By definition, they are all different. Sketching and drawing are typically differentiated by the level of fidelity. Drawing is thought of as the polished form whereas sketching is often referred to as the preliminary stage of drawing. Doodling is the red-headed stepchild, unlovingly defined as “to draw or scribble idly” or better yet, “to waste (time) in aimless or foolish activity.” In defense of doodling and in support of all three, we’ll explore how they benefit us in our day-to-day.
Thinking visually is a powerful tool in connecting, creating, communicating and comprehending the world around us. In an article highlighting cognitive benefits of doodling, Sunni Brown, author of “The Doodle Revolution”, warns us of the mindset which stops people from creating,
“To make the practice (of doodling) into something that requires savvy would be as dangerous as suggesting that only people who excel at writing should ever compose sentences.”
With that, consider these as tools in the following ways:
Getting visual an icebreaker: Because of our apprehension to create, it can be awkward. Relating to others over something universally discomforting can be oddly comforting.
Getting visual as a way to come up with new ideas: Drawing fast and loose allows us to have half-formulated ideas with room to grow.
Getting visual as a communication tool: We connect to images we recognize; let your ability to rough out forms help people relate to your ideas.
Getting visual to better comprehend and understand your learnings: Making things visual is tool for comprehension, reinforcing what we hear.
Connecting
The very thought of creating something and then showing it to others heightens a sense of vulnerability. With vulnerability comes great opportunity to smash down walls. Use sketching as an icebreaker to connect with new teams and new clients. It’s a great way to unleash a little silliness and level the playing field of any room you’re in.
Imagine if you can, you’re to plan the menu for your best friend’s wedding...with Gordon Ramsay. The thought is actually quite terrifying. “He’s going to make me cry and we haven’t even met yet”, you think to yourself. You’re well aware of what your friend likes and you have heaps of ideas. As the planning begins, shaking in your boots, you’re feeling inferior and you don’t speak up. This is a problem.
In far less hypothetical scenarios, people feel this level of doubt and fear within new groups all the time. Do these people know more than me? Are my ideas valuable? What if the topic was already covered? The very thought of being wrong or making mistakes is enough to silence meaningful voices. There is plenty of merit in telling people there is no right answer and to embrace just doing. Sketching is an interactive way to reinforce that notion. When you take time to recognize no matter who you are in that room, your different skillsets and different point of views, we remember that we all share a common language.
Icebreaker activity: Everyone is given a blank piece of paper and a pen or pencil. At random, a letter is drawn. If the letter drawn is a “P” everyone is to take two to three minutes to draw everything they can possibly think of that starts with the letter “P”. When the time is up, pair up with someone and compare. There are a few lessons bundled in this activity:
First, we recognize the quickness of the activity. Rest easy knowing in under five minutes, everything is going to be unpolished.Next, we realize even our chicken scratch can be understood. It might be two ovals and a triangle, but every person recognizes it’s a penguin. Patterns will surface of the things people automatically gravitate toward, multiple people drawing the same object from one letter.The walls of uncertainty and self doubt fall as we laugh together and find we all can find common ground.
Shout to to Lori over at Mutually Human for telling us about this.
Creating
Getting the wheels spinning and kicking off the creative process can be an overwhelming feat. When the world is your oyster it’s hard to know where to begin. Often we have ideas but the inability to express what we have churning in our mind stops us in our tracks. Engaging with our visual language helps us gain access to parts of our brain not easily accessible when we’re operating in linguistic mode. Sunni Brown speaks to this block: “Most of us use reading, writing, and talking to brainstorm, but the human mind is very habit forming. To break that habit, you have to think in an unfamiliar medium, a visual medium.” Breaking our habits helps up break the mold of old thoughts and discover new ideas.
Much like creating a mind map, drawing (sketching and doodling) helps us build on ideas and find connections. Your teammate might draw something but you see it from a different angle and build on it in a new light. Drawings, like actions, often speak louder than words could ever do. The world is full of complexities and emotions without definitions. Making it visual allows us to speak in words the English language has not yet formalized.
Ideation activity We call this the bad idea blitz. Sometimes it takes clearing your mind of its crazy to unveil a shiny nugget of brilliance. This works alone or with a team. Do this at the beginning of ideation or when your team is feeling low on creative juices and ideas. First step is to know what you’re ideating for; is it an overall solution or the springboard of where to begin? Take a piece of paper and fold it so you have six rectangles. Give yourself one minute to come up with six terribly wonderful ideas. At the end, you likely didn’t come up with your final solution but you have pushed yourself to think outside of the box and loosened up those creative thinking muscles.
Communicating
Stick figures, scribbles, arrows, these are visual marks predating anything our verbal language could say. Drawing is a communication mechanism used by artists, architects, mathematicians, and careers spanning far and wide. Drawing can be a tool for communication when there isn’t a common language. Where words fail, imagery prevails.
Examples from many moons ago. My dad was in Paris when he was approached by a French man hoping to send his love letters to his girlfriend in New York. Their language barrier was much less of a barrier once they began drawing.
Comprehension
Comprehension is where doodling takes the stage. Doodling has been widely researched in its relation to comprehend and remember information. Published in the Journal of Applied Cognitive Psychology, researchers found people that doodle find it upwards of 29% easier to recall dull information, than people that do not doodle. There is much more time to daydream when you’re not doodling. In class, during lectures, or in meetings are great times to doodle.
“Few of us can effectively take point-by-point linguistic notes while listening to people talk, because the auditory information competes with the written information. But visual attention is like a learning loophole; it doesn’t compete with what we hear. That’s why doodling in school can actually help you learn.” -Sunni Brown
Comprehension activity: Sketchnoting can be thought of as purposeful doodling or as a method of note taking. At the core, it is just that: taking notes though a series of synthesized thoughts using doodles of shapes, words, and connectors to help remember information later down the road. An article in Core77 wonderfully breaks down the parts of sketchnoting and is a great jumping off point for your first sketchnote experience.
Core 77 breaks sketchnoting down into 7 elements:
Text: meaningful points, quotes, and quips. Use typographic treatments to make important information pop.
Containers: enclosing ideas, words, icons, into one structure. This helps identify grouped information.
Connectors: Lines, arrows, visual indicators to show linked information.
Frameworks: Some presentations might have an obvious structure. Frameworks help you synthesize into your own underlying structure.
Icons: Icons help represent an idea as simply as possible.
Shading: Add emphasis and contrast to your notes with shading. Color: Once you’re ready, add color. This helps distinguish different information.
From EU’s first go at sketchnoting to a Ted Talk.
Drawing, sketching, doodling: the act of making an idea or thought visual. These are tools we’ve known our whole life and I argue valuable enough to be revisited. Put aside the intimidation of being good at “art”. Forget the preconceived notions that doodling is equivalent to being bored. Rethink how drawing can be used as a tool across all aspects of your team, not just the creatives.
~ Emily, Designer
0 notes
Text
West Michigan Design Community Highlight
Frances Close
In the spirit of West Michigan Design Week, we’re featuring an interview we did with UX designer and coLearning instructor, Frances Close. We love hearing stories from our peers on how they got to where they are today.
Frances is a UX designer at OpenDigital, formerly Visualhero, which is now part of Open Systems Technologies (OST). As a design lead, Frances’ day-to-day involves visual design, UX design, art direction, and assembling and leading project teams. Frances initially wanted to study psychology but a vocational class in high school led to an interest in visual design. She built up her portfolio and graduated from Grand Valley State University.
Frances began her career in roles that introduced her to branding, marketing, and visual design at studios in Chicago. After relocating back to West Michigan from living in Chicago, Frances worked as a visual designer at an agency called Plenty, doing work for nonprofit clients like the Grand Rapids Community Foundation and Friends of Grand Rapids Parks. Contract projects with other local studios helped her gain confidence as a freelancer, which lead to a realization that she didn’t just want to make things look good; she wanted them to work as well.
She realized she didn’t just want to make things look good; she wanted them to work as well.
In order to accomplish this, Frances knew she needed to gain a solid foundation in how digital products operated. Frances’ experience taking the the Modern Web coLearning course taught by Jeremy Abrahams helped her become more fluent in HTML and CSS, which improved communication with her software developer coworkers.
She says that user experience is broad—it’s not just a digital workflow. At OpenDigital, Frances and Christy Ennis-Kloote, Director of Product Design formed a lot of the UX principles that her team practices today.
“Don’t be afraid to get in and start failing.”
Her advice is to meet people, network, leverage the local community, and get involved with groups like AIGA, IxDA, Ladies That UX. She believes that mentors can come from anywhere and says that if she’s comfortable in what she’s doing, she is not learning or growing. Frances points to mentors for supporting her along the way, both in the local design community in Grand Rapids and from her time in Chicago. She believes that mentors are important and spends time mentoring students, coworkers, and members of the design community. Frances also teaches UX Design at coLearning.
For visual designers looking to transition in to UX and product design, Frances advises becoming more comfortable understanding the limitations of the web and digital platforms and to try do things even if they don’t feel fully qualified to do them: “Don’t be afraid to get in and start failing.”
0 notes
Text
Load Testing Your Next Application
Load testing your Rails Authentication Application.
So you have a project that you have been developing for quite some time. And you want to know how well it's going to stack up against the masses once it goes live. All the database querying and code refactoring that went into the project appears to be in the best shape possible. But what if you missed something or you're concerned about the efficiency of a particular feature? Load Testing is a method used by companies to determine the efficiency of their developed site so they know how it's going to perform the day of a launch.
There isn't anything inherently special about load testing, other than it's a method for spamming requests to diagnose response times. A developer will generally write scripts containing URL requests in the GET, POST, and PATCH/PUT format. In practice we should be most concerned with the GET and POST types of requests because these are generally going to make up 90% of any given application.
For the sake of compliance we have decided as a company to use Loadimpact.com as our third party service for testing our applications. As such, all coding examples are in the LUA language using load impacts API.
One thing that might stop developers from proceeding with advancing their load testing, is a modern authentication system, assuming you have critical features or your entire site is behind a login screen. Knowing how to maneuver around it, is a critical element to your arsenal. Simple HTTP logins are very simple.
http.request({ method="GET", url="http://example.com/", headers={ ["Authorization"]= 'Basic ' .. base64.encode(username .. ':' .. password) } })
A simple form login isn’t much effort either
http.request_batch({ { method="POST", url="http://example.com/login", data="username=example&password=password123" headers = {['content-type'] = "application/x-www-form-urlencoded"}, }, { method="GET", url="http://example.com/content" }})
This process can get interesting when we look at authentication methods such as Rails + Devise. There are a couple of parts to know about while load testing an application using this conjunction. First, it requires that you provide a CSRF Token along with the username and password. Second, it will require you to have a valid cookie set on your machine. The first step we need to take is to obtain a valid CSRF token to be submitted. We do this by first submitting a GET request to retrieve the login form
local pages = http.request_batch({ {"GET", 'https://example.com/login', response_body_bytes=10000000} })
From there we need to parse out the token.
local auth_token = string.match(pages[1].body, 'name="authenticity_token" value="(.-)"')
* Understand that authenticity_token might not be the same name or id used by your login form. Refer to Load Impact support for additional examples.
From here the process is very simple: we just need to submit login credentials to the server along with our captured token value. Expect we also need to ensure we `url.escape` all of our assigned values. Otherwise, we risk being rejected by the server
local post_data = "user[email]=".. url.escape(email) .. "&user[password]=".. url.escape(password) .. "&authenticity_token=".. url.escape(token)
Followed by submitting it to the login post path
http.request_batch({ {"POST", form_url, headers = {['content-type'] = "application/x-www-form-urlencoded"}, data= post_data, response_body_bytes = 1000000 } })
Something that you cannot do is request_batch multiple urls (IE: chain URL requests) from the initial POST login request. This is because of the second part of a modern authentication system. A cookie *must* be set in order for you to proceed. According to Load Impact, a cookie is only set once that batch function has fully completed. However, the cookie is set to last during the entire runtime of the script. So you’ll need to chain together requests in a totally different call. Here’s a simple LUA script that has handled some of the authentication concerns.
site_url = "https://example.com" global_email = "[email protected]" password = "password123" function form_post_reponse(form_url, post_data) log.debug("URL form=", form_url) log.debug("DATA FORM=", post_data) local response = http.request_batch({ {"POST", form_url, headers = {['content-type'] = "application/x-www-form-urlencoded"}, data= post_data, response_body_bytes = 1000000 } }) return response[1] end unction get_token(url) local pages = http.request_batch({ {"GET", url, response_body_bytes=10000000} }) local auth_token = string.match(pages[1].body, 'name="authenticity_token" value="(.-)"') log.info("auth_token", auth_token) return auth_token end function login(email) local login_path = site_url .. "/sign_in" local token = get_token(login_path) local post_data = "user[email]=".. url.escape(email) .. "&user[password]=".. url.escape(password) .. "&authenticity_token=".. url.escape(token) return form_post_reponse(login_path, post_data) end login(global_email) -- More scripting mumbo-jumbo
That’s about it for getting around a Rails+Devise authentication system. Now you can spend your valuable time crafting realistic user scenarios to test your questionable features. If you have any questions or feedback, please feel free to comment below.
~George Karaszi, Software Developer
0 notes
Text
🍕 82 Million Dollar Pizza: The Bitcoin Craze
A cluster of desks in the Elevator Up office has been dubbed “Crypto Island”. Team members at these desks got excited by the dramatic rise in the price of Bitcoin in late September 2017, when one Bitcoin had just passed a value of $4,000. Less than three months later, one Bitcoin climbed to a value of more than four times that amount, so it’s definitely a trend worth investigating.
A coworker got me started by sending 10 US dollars’ worth of Bitcoin (about 0.000692 Bitcoin, or BTC) to my new Coinbase account, and I’ve been contributing money and tracking the price of currencies like Bitcoin, Litecoin, and Ethereum ever since. It’s a very abstract concept to wrap your head around, so I’ll try to break it down.
What is Bitcoin?
Bitcoin is a cryptocurrency. Cryptocurrencies are purely digital currencies, meaning that a physical representation of Bitcoin (like cash or gold) is not necessary and therefore does not exist. While cryptocurrency market consists of at least 1,000 players like Litecoin and Ethereum, Bitcoin arrived on the scene first and has the biggest following and current market cap.
Unlike traditional money (fiat currency), Bitcoin is not controlled by a centralized bank or regulated by a government. Also unlike fiat currency, which is produced by central banks by decree, theoretically making its supply unlimited, the number of Bitcoins that can ever be discovered is strictly limited to 21 million. In this regard, Bitcoin has more in common with gold than the US dollar. In addition to being such a speculative form of currency, these factors contribute to its volatility.
How does it work?
Bitcoin is made possible through blockchain technology: each time Bitcoins exchange hands, the transaction is recorded in a public database or ledger. The database lives across multiple devices called nodes (essentially decentralized servers, or the opposite of “the cloud”). Every 10 minutes, people who own nodes verify a set of transactions or blocks. The people who do this are called miners.
Transactions are verified by miners solving complex mathematical equations to make sure the numbers add up. The block is added to the ledger once verified, forming a chain of blocks, and the first miner to verify the block is rewarded for their work with a new Bitcoin. The Bitcoin source code was designed to strictly limit the number of Bitcoins to 21 million. This is achieved by slowing the rate at which the creation of new blockchain copies produces new Bitcoin, which halves about every four years.
As of December 2017, miners have verified more than 16.7 million Bitcoins (blocks of verified transactions), leaving about 4.3 million Bitcoins (blocks of unverified transactions) left to be mined, and those are increasingly difficult to find. Assuming that people still care about and mine Bitcoin over the next century, the last Bitcoin is expected to be discovered around 2140. After all Bitcoins have been mined, miners will be compensated in Bitcoin transaction fees instead of with new Bitcoins.
How do you buy Bitcoin?
You can buy Bitcoin in increments unless you really want to throw down thousands of dollars to buy one full Bitcoin. There are two main ways to obtain Bitcoin: you can purchase Bitcoin at the fair market value using regular cash currency like US dollars, yen, or euros from online currency exchanges like Coinbase or Square Cash or from physical Bitcoin ATMs. The primary function of Square Cash is to allow users to instantly send money (actual dollars) between friends or for business transactions, similar to services like Venmo and PayPal. For now, the Square Cash app only allows users to buy, sell and hold Bitcoins. Making payments between friends with the cryptocurrency is not yet supported.
The other way to obtain Bitcoins is through mining, which involves finding a verified Bitcoin transaction online and getting paid in Bitcoin for finding and verifying these transactions.
How do you use it?
To store your cryptocurrency, you’ll need a “wallet”. Just like regular currency, Bitcoins can be used to pay for things. Fiat currency still rules finances today, but brick-and-mortar businesses like CVS and Home Depot, as well as many digital companies like Stripe, Tesla, Microsoft, Amazon, PayPal, Expedia, Overstock.com, and even the singer Bjork (among others), currently or are planning to accept Bitcoins as a form of payment.
A famous Bitcoin story involves a developer asking friends in an online forum to buy him two large pizzas in exchange for 10,000 Bitcoins—$82 million in today’s value. Keep the change, ya filthy animal. This exchange on May 22, 2010 is believed to be the world’s first record of a Bitcoin transaction (and possibly the world’s best ROI on a pizza purchase), and May 22 is now named “Bitcoin Pizza Day”. Mark your calendars.
There are two main advantages to using Bitcoin:
All transactions can be completed without a bank—skip the paperwork and transaction fees, regulation, and exchange rates and fees when sending money overseas.
All transactions are anonymous—your name and identity are not revealed.
Cryptocurrencies like Bitcoin have other advantages, but not without severe risk. Although Bitcoin units are nearly impossible to duplicate, users are not immune to theft or fraud—sophisticated hackers have found ways to steal Bitcoin, which is a major vulnerability to unregulated and untraceable currencies. The most notable hack to date involves Mt. Gox, a popular Bitcoin exchange that lost almost 750,000 of its customers’ Bitcoins and around 100,000 of its own Bitcoins—totaling around 7% of all Bitcoins—which were worth around $473 million at the time. It filed for bankruptcy protection, was shut down, and the repercussions of catastrophic events like this make risk-averse investors steer clear of converting their cash to Bitcoin.
Where did it come from?
It was created in January 2009 by someone with the alias Satoshi Nakamoto, a pseudonym—the real identity of this person or group of people is still unknown. At its inception, one Bitcoin was worth about ¼ of a cent, or basically $0. As of this writing, one Bitcoin is worth over $16,000 and seems to reach new record highs each day. This extreme fluctuation in price has led to trading on Bitcoin futures and financial analysts are warning about a bubble, but that doesn’t seem to be stopping people who truly believe in this technology.
What happens next?
What happens when all 21 million Bitcoins are discovered? We don’t know! The value could fluctuate up, down, or stay the same. Why is this relevant? It’s a highly controversial topic: supporters say it’s the currency of the future and is set to become as mainstream as the internet; opponents liken it to the black market and say that it will never catch on fully because governments cannot regulate it, but Japan is the first big country to begin regulating blockchain digital currency. What this means for the rest of the world remains to be seen.
Financial experts are weighing in on Bitcoin other cryptocurrencies: some, like billionaire Warren Buffet, said "I can say with almost certainty that they will come to a bad ending," to CNBC, but also admitted that he knew nothing about them.
JPMorgan CEO Jamie Dimon initially called Bitcoin a fraud, “worse than tulip bulbs”, and threatened to fire any trader who bought or sold them for being “stupid” but he recently recanted those statements, saying "the bitcoin to me was always what the governments are going to feel about bitcoin as it gets really big." He still is not very interested in the subject, and thinks that government intervention may eventually hamper bitcoin’s growth and acceptance (Chicago Tribune).
The emergence of the cryptocurrency markets has been wildly entertaining to track, and who knows where they will go from here. What are your thoughts? Are you buying the hype?
~Natalie, Crypto Island founding member & alternative investing enthusiast
0 notes
Text
Simple Android + Kotlin tutorial in 136 lines of code
Android supports a programming language called Kotlin!
Here’s a little tutorial on how to make that Beer App I designed in this blog here (Resuable objects in Sketch) in Kotlin for Android.
Just want to read the code? Here’s the repo: (GitHub Repo)
Getting Started
You’ll need a version of Android Studio that supports Kotlin. I used Android Studio Preview 3.0 Canary 5, but you can view the lastest version here (Android Studio Preview)
To get started, create a new project and make sure it has Kotlin support checked.
Ok! Now we can get to coding. For the sake of time, I’m going to skip the View related things and just focus on Kotlin.
Step by Step
Step 1: Build our Beer Model
This is a custom class that will hold the info for each beer we want to show in the list.
? means the property can be null
And = null means the default value is null
Step 2: Create our list of Beers
This will be the data for our list of beers. (I set this in onCreate of the MainActivity)
Notice the use of val. val in Kotlin means the object is read-only and once the object is set, it can’t change.
Step 3: Build our List’s Adapter
These functions are standard for creating a list with RecyclerView in Android.
Step 4: Link our Adapter to the RecyclerView
Back in onCreate of MainActivity, take our list of beers, add them to a view, and show them in the RecyclerView. RecyclerView in Android is a poorly named highly performant list.
That’s it! All app functionality done in 1 Kotlin class & 136 lines (with comments!).
- EU Developers
#android#kotlin#programming#development#software#software developer#software development#programming language#code#technlogy#recyclerview#android studio
0 notes
Text
Making the Most of Networking
A part of the role of Program Manager for coLearning is to connect with people in the community. I’ve attended numerous events in an effort to meet some great new people, and I haven’t been disappointed by what West Michigan has to offer. It can be tough to make every Meetup or event, and even tougher still to make sure I’m being as effective as I can in making connections and representing coLearning. Now that I’ve hit a good stride, I’m happy to share some of the strategies I implement that can be replicated by others who network either for work or just want to meet great people.
Schedule your events ahead of time
One helpful starting point is mapping out the coming events that would be relevant to you or your cause. Some of this requires a little bit of research on what’s coming up. A good resource I’ve used to help know what’s coming is meetup.com, a website that lists local gatherings by location. Meetup is a great resource for anyone since it can show you groups getting together regardless of your location. While it covers a large number of events, it would also be helpful to check out the calendars for organizations in your area that align with what you are looking for if they are available. Some great examples for us are Creative Mornings, AIGA and WMCAT. They hold or list events that help us connect with the creative community in Grand Rapids. I try to have a monthly map of events where I’ll check at the beginning of the week to see if anything has been added to keep up with last minute changes.
Come with a plan
I find that I’m more effective when I come to an event with a set of goals. Those goals can include an aim of the number of people I want to connect with or even a short list of people who I want to meet before the event is over. If you have trouble setting these goals try asking yourself a few questions:
What are your company’s goals?
What are your personal goals?
What type of person can help you achieve them?
What would be helpful for you to learn more about?
What questions can you be prepared to ask?
Meetups have a list of attendees who show an interest in an event or may even list that they are coming. This can be a good reference point to see who you might want to connect with. Even if they don’t come, you can know who they are and maybe follow them on social to see what other opportunities you have to meet them if you don’t feel comfortable reaching out directly.
Bring business cards or leave behinds
This may seem like a given or even a little cliche but there have been a couple times where I met someone at an event and had nothing to leave behind so they can remember me. You’d be surprised how many people keep business cards and will stumble upon them later when a need arises. It’s always a good idea to keep tabs on these when they are running low so you don’t miss out on a chance to leave people with something at events.
Talk to learn
You’ve probably heard before that people love to talk about themselves, and that hasn’t changed much over time. Connecting with someone involves getting to know them and genuinely caring about who they are and what they do. It can be hard when you have a goal set for the evening, but you want to be engaging in every conversation you have because you never know when the person you’re talking with can be helpful.
A big part of this is asking questions. It helps to have a great conversation that is interesting to both parties and feels organic, but I think we’ve all been in plenty of conversations that feel off or awkward to navigate. That’s why it can be helpful to have a list of general open-ended questions in mind before events that can help bring out the personality of who you’re talking with. You can find some great suggestions for questions just by Googling, so I’d recommend checking out specific ones to what you want to learn from that person. Some examples I find myself using often are:
Tell me a little about what you do at X.
How did you get involved in Y?
What are some major changes that have taken place in X industry over the past few years?
What do you love/hate the most about working in X?
After asking these questions, it’s important that you are actively listening and not just trying to think of what you’re going to say next. The best compliment I’ve received from people I connect with is that I’m a great listener, because at the end of the day people love to be heard. You can still be passionate in sharing who you are or what you represent, but I’d even suggest taking more time to listen. If you open up the conversation with good questions, show genuine interest through active listening, and still have trouble with the conversation, it might be a good sign that you should try connecting with someone else.
Note who you met
You often hear people say they’re terrible with names. I think it isn’t so much that, as it is when you meet a lot of people at once, it can be tough to recall all the information you need. One way you can help yourself with this is to try to save time after an event to take some notes on key meetings or conversations you had. It doesn’t even hurt to make a quick note or two on a business card while you’re there.
People often will be flattered that you show you truly care to remember your interaction. As long as you don’t take too much time to the point of being rude, you can gain a lot from noting the interaction and even reviewing it if you think you’ll see them again.
These strategies have been helpful for me in connecting with new people, and as a result I’ve noticed that I’m becoming more and more familiar with the people who attend these events. The end result is that people are starting to know me and I’m building a positive reputation for myself and coLearning. I’d love to know what other strategies you networkers are using as you connect with your communities!
0 notes
Text
Deconstructing the tower of knowledge
In December, a few members of the team and I headed out on the first snowy day of the season to Ann Arbor. We were on a mission to tour a couple of companies we admire, including Zingerman’s training facility, Zing Train, and Menlo Industries. I could go on and on with all of the epiphanies we experienced while we were on our tours, but the thing I want to focus on hit me while we were at Menlo. They discussed their experience with pairing like roles, programmers with programmers and anthropologists with anthropologists, to get work done.
They even put it into practice while they were hosting the tour. There were a couple of times when one person would ask his partner where he was going with his thought or would ask if there was something he missed. They were able to jump in and help one another organize thoughts and mention things that wouldn’t have been mentioned without a second person hosting alongside him.
As it relates to work, one of the things I was most impressed with was the danger of creating a tower of knowledge around a certain subject. Their practice explicitly rotates people from project to project and splits and joins partners with one another. For example, let’s say Jim and Jen are working on project x. After a day or two, Jim will rotate off project x. Julia will rotate onto project x, and it’ll be Jen’s responsibility to catch her up on the work she and Jim did together as well as work together to build project x’s new tasks. This may sound cumbersome and stressful, but what they’re doing is breaking down silos. They’re increasing visibility into each other’s work so that when Jim goes on vacation, he doesn’t need to worry about the state of the project. He knows that he and Jen and now Julia all have the knowledge they need to keep moving forward.
One of the questions that was asked relating to paired programming was that around scheduling and adhering to a true 40 hour work week. One of Menlo’s rules is that each employee cannot work without his/her partner present. He/She can work on admin tasks solo, but he/she is not allowed to review or produce anything new without his/her partner present. This concept is interesting because it forces collaboration and shared accountability among partners and teammates. For example, if one teammate has an appointment, it’s his/her responsibility to work out an appropriate work schedule with his/her partner. It takes the ownership off “the boss/the pm” and puts it on the developers to solve problems and figure out solutions together.
I feel like I need to address the elephant in the room. Surely you’re thinking this as you’re reading along. I could imagine that paired work could present a few challenges, namely one with conflict or confrontation. They employ a shared language to make sure they’re being respectful while collaborating and sharing ideas with one another. Agreeing upon common ways to address issues, offer suggestions and advice helps to lower everyone’s guard and builds the foundation upon which safe communication can happen.
I’ve been thinking about these methods in my role and how I might be able to provide more visibility into the tasks I perform on a regular basis, i.e. how might I not become a tower of knowledge and spread information among the whole company/membership. Though I already employ a few different methods to make sure I’m not bottlenecking information, I know there are things I could be doing better.
In the everyday, I employ this practice by empowering members to #askamember first. It’s easy for members to come to me when they have questions because I’m the “employee” of the business. I’ve begun teaching new members that it’s okay to ask questions to members before asking me. I’ve noticed that members enjoy teaching new members how to do new tasks or show a new person the ropes. Not only does it benefit the new member, but also the one teaching because he/she is able to pass along knowledge to a new person and put things that he/she has learned into practice.
I also recently put together a guide of how I give tours and onboard new members. I had a number of members who wanted to feel empowered to give tours, show new people around, and help them get comfortable on their first day. Creating these documents for members help give them confidence so that anyone can perform these tasks comfortably. And, once I realized prospective and new members would much rather hear directly from members rather than from me, it made the decision that much easier to create and post these documents publicly. They live in a clipboard posted at the front door for anyone to perform when needed.
These are just a couple of examples in which we are creating a culture that is conducive to removing barriers and deconstructing the tower of knowledge. We believe nearly anyone can pitch in and contribute to our community to make it a stronger and more vibrant one. We encourage a culture of service and leadership by example. Though there are many more things we can do to further increase visibility within our organization, I believe we are moving in the right direction with a couple of these projects we’ve completed. When your community is full of members who are willing and excited about helping and shaping your organization’s culture, you need to learn how to step back and give people the tools they need to make their community thrive. I’m excited about where we’re headed.
~amelie, community manager
#amelie#coworking#community#visibility#capability#teamwork#thriving#process#project management#pairing#pair#Zingermans#Menlo#Ann Arbor#Michigan#teaching#community of businesses
0 notes
Text
Activerecord Rails to Ecto Elixir
The past decade has seen a swarm of new languages and technologies merge. Some have flourished with major companies backing them, like GO from Google, while others have slowly seen a drop in their popularity. With so many choices in the world, evaluating a new language and what merits they contain becomes of vital importance. Which brings us to Elixir, a language that has boasted about its overall performance, its scalability and stability thanks to its parent language, Erlang.
STARTER PROJECT NEEDS
Coming from a professional Ruby background, I was really intrigued by Elixir’s promises. And with frameworks such as Phoenix which has been praised for its sleek design without the underlying magic that you see in Rails. I had some incentive to begin my exploration to developed a few starter projects that could cover most web application needs.
To cover the grounds of what most web applications do, I needed to develop something that had the following tasks
Authentication
Multi-level model associations
Image processing
To accomplish this, I decided to make a forum project. A perfect start that requires all the the tasks listed above.
The user is required to authenticate using Github’s OAuth system.
The user can create categories.
The user can create thread’s inside of categories.
Then the user can post inside of a thread.
Finally, we allow the user to upload an avatar, that is processed with imagemagick then uploaded to an S3 bucket for displaying.
INTRODUCING ECTO
As a Rails developer, I’ve grown quite accustomed to Active Record and all the little bells and whistles that an object oriented program (OOP) provides. Luckily the community of Elixir has a solution for dealing with database querying called Ecto. Ecto is a highly customizable, yet super barebones solution for managing your database.
Here’s an example of what querying in Active Record Vs. Ecto looks like. ActiveRecord:
Ecto:
Immediately we can start to see some pretty stark differences. In the Rails example, Active Record is inherited into the User model, simplifying the query command. Whereas Elixir doesn’t have the concepts of OOP and from what we see is a very SQL query like experience. Out of the box, Ecto isn’t geared to morph into functions that help manage your model records. There are however quarks to this when introducing meta-programming, but that goes beyond the scope of this blog :).
QUERYING WITH ECTO
Let’s take a moment to look at an example of querying all posts for a given user between Rails and Ecto.
With Rails it’s really simple
Rails doesn’t require the object to be joined in any fashion to access the user's posts. While there might be cases of N+1 performance issues, it still doesn’t prevent it.
With Elixir there's a little bit more work to be done.
While it is more work to effectively accomplish the same task, the question that remains is, Is it bad? In short no, its not. The biggest obstacle between switching between Ruby and Elixir is the idea of modular design. Good design patterns are long held as the holy grail of good programming behavior. Elixir and Ecto isn’t designed to do magic behind the scenes. It forces its developers to think how and why they are implementing features. This reason alone among many others, is why querying with Ecto can offer a much faster response time than that of Active Record. We run proper joins where we need them, retrieve only the data we care about, and not the stuff we’ll never use.
COMPLEX QUERYING WITH ECTO
For the final example I want to present what a complex query looks like in Ecto. The end goal is to select the latest thread for all categories by the ordering of a thread’s post creation date. All while returning the pre-loaded user data. This is a fairly typical query you’ll see when viewing a forum that shows the latest post for a given topic. (https://www.vbulletin.com/forum/)
Essentially our schema looks like this:
Translation A Category has many Threads
A Thread belongs to a Category A Thread has many Posts A Post belongs to A Thread A Post belongs to A User A User has many Posts
To accomplish our goal, we need to break this down into a few nested queries that our database can understand.
We need to order all post by their creation date and distinctively select posts based on their parent’s thread id.
From there we join thread’s and post together. While maintaining the ordering the post’s came in.
Since we only want one thread for every category, we need to distinctively select threads by their parent’s category id.
Finally we join both thread and categories together to return a latest thread and post for each topic.
Here is what it looks like when this is all put together:
FINAL THOUGHTS
Elixir is a growing language and with the aid of Ecto, it can now start to become more and more mainstream. Both myself and the rest of the developers here at Elevator Up are really excited for the future of Elixir. We see it as a very scalable and stable platform that plenty of business could leverage for their next upcoming projects.
Forum Source https://github.com/GeorgeKaraszi/MockForum
~George Karaszi, Software Developer
0 notes
Text
Boost Your Bash
Knowledge gaps: not only can they make us lose at trivia, but they also make us less efficient programmers. Anything is easy when you know the answers!
Bash is the default command-line shell on most Linux distributions, macOS, and you can install a Linux-based bash environment on Windows 10. Knowing a few Bash shortcuts is a huge productivity booster, but maybe you just never took the time to save yourself time? We're all busy people, so here's a handful of tips to boost your command line super powers.
Traversing the File system
Go Home!
The tilde character represents the active user's home directory.
cd ~ cd ~/work/important-stuff/ cp ~/password-file.secret .
Dash back:
The lowly hyphen is a shortcut to the last directory you were in
cd -
Bonus tip: the hyphen can also represent your last active branch for git.
git checkout -
Moving the Cursor
You probably already know how to autocomplete directory and file names using the TAB key, and it's likely you've stumbled across the UP/DOWN arrows as a way to step back/forward through the commands you've previously issued, but that my friend is merely the tip of the proverbial iceberg.
Do you type or recall long commands, then lean on left/right arrow key because you need to change something at the start/end of the line? Yeah, me too until I discovered CTRL+ shortcuts. Recently while pairing with a much smarter dev, he wished out loud he could flit around the command line as gracefully as I. Now who's the S.M.R.T. one? #holdmybeer
Use the following shortcuts to quickly move the cursor around the current line while typing a command:
Ctrl+A: Go to the beginning of the line
Ctrl+E: Go to the end of the line
Alt+B: Go left (back) one word
Ctrl+B: Go left (back) one character
Alt+F: Go right (forward) one word
Ctrl+F: Go right (forward) one character
Ctrl+XX: Move between the beginning of the line and the current position of the cursor. This allows you to press Ctrl+XX to return to the start of the line, change something, and then press Ctrl+XX to go back to your original cursor position. To use this shortcut, hold the Ctrl key and tap the X key twice.
These shortcut key combos and many more can be found on How to Geek. Also find Windows-centric variations on Lifehacker.
Issuing Commands
DRY!! (Don't Repeat Yourself BANG BANG)
Two exclamation points (exclamation marks for the recently-naturalized) represent "the last thing I entered" and can be used anywhere within a new command. Typing a space or hitting RETURN will expand the bangs inline and allow you to continue typing. BEWARE: Accidentally typing three exclamation points will summon a dance-punk band from Sacramento.
Sometimes you want to repeat youself, but with more authority.
cat /etc/sudoers permission denied: /etc/sudoers sudo !! totes, will do
Super user tip: !!:* represents the arguments of the previous command
mkdir ~/omg/really/long/path/to/new/directory cd !!:*
Clipboard Commands
Output of CLI command to clipboard:
Use a single pipe to send the output of a commmand to the clipboard instead of the screen.
# [command] | pbcopy ls -la | pbcopy
Copy file contents to clipboard:
A less-than symbol transfers a file's contents to the clipboard. Useful for things like copying public keys.
# pbcopy < [filename] pbcopy < ~/.ssh/id_rsa.pub
Save clipboard contents as file:
If the file exists, all content will be replaced. If not, it will be created.
pbpaste > commands.txt
In case you were curious, 'pb' is short for 'pasteboard' ¯\_(ツ)_/¯
So much more
There's a ton of scope to submerge yourself in Bash. I'm paddling just beyond the command line shore here but there are huge benefits just from getting your feet wet.
~ Andy Westmoreland, Developer and Bash Explorer
0 notes
Text
Grid: Making CSS Layout Exciting Again!
Much has already been written and spoken about CSS Grid, but it's not until you begin to play around with it that you fully appreciate its simplicity and also how powerful it is.
Grid's layout functionality doesn't supersede Position, Flexbox or Float, and can be used in harmony with any and all. But while Flexbox excels at arranging content in rows, CSS Grid Layout enables two-dimensional layout without requiring the additional markup for row wrappers, and elements can span rows in a predictable and robust way.
Grid allows us to display content in a 3D manner, specifying not only horizontal, vertical and z-index positions, but also display elements at named references within the grid in an order that may be different than the DOM.
Source: Jen Simmons - Designing with Grid
As with any new specification, the rate of adoption relies heavily on its level of browser support and how onerous it is to ensure backward compatibility, but it's worth bearing in mind that this is the first time a major specification has been made available in major browsers almost simultaneously, and at the heart of its simplicity is the attention given to progressive enhancement in implementation.
Grid containers are not block containers, and so some properties that were designed with the assumption of block layout don’t apply in the context of grid layout. In particular:
the column-* properties in the Multi-column Layout module [CSS3COL] have no effect on a grid container.
float and clear have no effect on a grid item, however, the float property still affects the computed value of display on children of a grid container, as this occurs before grid items are determined.
vertical-align has no effect on a grid item
What this means is that you don't need to spend a ton of effort undoing previously-applied block container properties and any fallbacks can typically be limited to width, margin & padding. Flexbox, floats, etc will continue to work for browsers that don't support Grid, and Grid properties will simply be ignored.
In the cases where you need to deliver a significantly different experience based on Grid support (or lack thereof) consider using @supports, but know what you're getting into.
CSS Grid IRL
The Factory's Community page is a very simple floated layout of members, and so a good candidate for experimenting with Grid. In around 25 lines of CSS (additional lines added for color highlighting) I was able to not only enhance the layout to use CSS Grid, but also set the grid elements to:
be different but relative sizes
resize (within set limits) to optimally fit the screen width
reflow (out of DOM order) to fill in gaps
The special sauce in the above code is the line: grid-auto-flow: dense;
This made me really excited to begin using CSS Grid! dense is a keyword specifying that the auto-placement algorithm uses a "dense" packing algorithm, which attempts to fill in holes earlier in the grid, if smaller items come up later. This may cause items to appear out-of-order, when doing so would fill in holes left by larger items.
This kind of layout jujitsu would previously have been the domain of JavaScript, possibly using a library such as Metafizzy's Isotope in Packery mode.
Dev Tools
As I was about to launch this post, Mozilla released Firefox Quantum: Developer Edition including an all new Devtools allowing developers to visualize Grid layout using outlines and overlays. More on this in a later post!
Further Reading
For much more information on CSS Grid, I recommend paying close attention to Rachel Andrew and Jen Simmons who have independently documented, presented on, and experimented extensively with Grid.
If you're looking to get up and exploring quickly, dive right into Rachel Andrew's Grid by Example and the accompanying video series, or try out CSS Grid Playground from Mirza Joldic.
Rachel Andrew
"The move from tables-for-layout to CSS changed the way the web looked. It moved us away from the pixel perfect chopped up images to something more flexible and text based, something less like print design. The look of the web over the past 15 years has been defined by the technical limitations of CSS. I think that our new layout methods - Grid, Flexbox along with things like Shapes - will redefine how the web looks once again. However we have to let it, we have to let ourselves experiment and learn and create new things."
Web: rachelandrew.co.uk
Twitter: @rachelandrew
YouTube
Jen Simmons
"It's time to go back to hand-coding layouts for each project. Of course, make reusable code for yourself and your company. Of course, create style guides and limit code chaos. Of course, use a starter-kit of some kind so you aren’t beginning each project staring at a blank page. But it's time to stop assuming your page layout design process looks like this: 1) Pick a third-party framework; 2) Pick one of the layouts that comes with that framework; 3) Limit all your ideas to what that framework can do. We don’t need that crutch anymore."
Web: jensimmons.com
Twitter: @jensimmons
YouTube
~ Andy Westmoreland, Frontend Developer
0 notes