Chapter 9

Coding on Your Own

In This Chapter

arrow Assessing time and money needed to learn to code

arrow Finding resources to learn coding on your own

arrow Using tips to keep progressing even when you get stuck

I am always doing that which I cannot do, in order that I may learn how to do it.

Pablo Picasso

When you decide that a career in coding is for you, there are many ways to take the plunge and start learning. You can learn by yourself, in modern high-intensity coding schools, in traditional environments such as a university or college, or on the job.

Unlike learning subjects like biology or chemistry, learning to code doesn’t require lots of expensive equipment or many years before you see results. You can learn how to code a feature or a function, and start implementing it right away. No matter what route you take to learn how to code, it’s a good idea to try learning a little bit on your own to see how you like it.

In this chapter, you choose a goal, discover the hardware and software you’ll need to start coding, and see the various free and low-cost resources available to learn coding on your own. Learning to code, especially on your own, is not easy — this chapter provides a roadmap to make the journey easier.

Assessing Your Goal, Time, and Budget

Whenever you start learning any new subject you should ask yourself the following questions”

  • What is your goal after you finish learning? Do you want a full-time job or part-time work? Do you want to perform your existing job more efficiently?
  • How much time you can commit?
  • How much money are you willing to spend?

Choosing your goal

The goal for many people is to do their existing job more efficiently. Chapter 2 covered different ways coding could improve your ability to do your job across a variety of roles. For example, you may love your job in sales, and you want to analyze the large volumes of data that your company has on which product the customers use the most, so you can find similar customers and build a list of prospects to solicit. Gradually, as you increase your proficiency, other companies may ask you to consult for them and build some similar capabilities. The commitment and resources required for a gradual change like this are low and constant, because you are learning over a long period of time.

For others, the goal might be more dramatic. You may want a full career change in the next six to twelve months. The commitment and resources required to make this type of switch are significant, but employers are becoming more comfortable with self-taught programmers.

Making time to learn how to code

To achieve your goal it is important to understand how much time is required in total and how you will plan your learning. If your goal is to learn a tool or complete a task at work more efficiently, you may need only a day to a week of training, along with some practice, to start seeing results. Learning to code in a week or less to complete simple tasks is possible for many coding fields, including web development, data analysis, and database management.

To switch careers and be employable as a full-time developer requires between 700 to 1,000 hours. That sounds like a lot, but you can complete that in about ten weeks with intense practice, or in six months to one year with less commitment.

tip Completing 700 hours of learning in 10 weeks requires a full-time commitment. However, if you want to learn during the course of a year, you might be able to devote 15 hours per week to study while working full-time, depending on your job.

When learning introductory coding topics, which take 50 hours to complete, the time you spend can be more sporadic — an hour between meetings at work, an hour each weeknight at home, and several hours during the weekend. As the topics become more complex, you’ll need dedicated blocks of time for learning and for debugging.

tip Book your dedicated time in your calendar now so you can keep progressing even when holidays, vacations, and birthdays pop up.

Spending money to learn how to code

Learning how to code on your own is the cheapest option in terms of cash spent, though you’ll need more time to set up your system and troubleshoot issues that arise. The good news is that putting aside hardware costs, the software and learning resources are free or inexpensive. In addition, you’ll find a community of experts and people learning like you who want to share information and support each other.

Purchasing computer hardware

Computer hardware can be expensive, but options exist at a variety of price ranges. Here are some options when purchasing a computer to learn to code:

  • Cheapest: Use your existing computer, whether PC or Macintosh. The software is usually harder to install on Windows-based systems than on computers running Linux, Unix, or Mac OS (which runs a version of Unix).

    tip For $89, Symple (at www.symplepc.com) sells a computer with a preinstalled Linux-based operating system and enough power to perform your coding tasks. You need to supply your own monitor, keyboard, and mouse.

  • Cheap: Chromebook laptops (see Figure 9-1) are portable and light but powerful enough to run coding software. They run Google’s Chrome operating system and are designed to be used while connected to the Internet. You can’t install traditional Mac, PC, or Linux applications, but you can install extensions made for the Chrome browser. These laptops typically retail for $200, and are manufactured by major companies such as Acer, HP, and Samsung.

    tip Codestarter (at Codestarter.org), a nonprofit that provides laptops to kids learning to code, has publicly released the script to turn a Chromebook Acer C720 into a coding machine complete with modern programming languages such as Python, Ruby, and NodeJS. Use the script by visiting github.com/codestarterorg/ubuntu-chromebook-installer.

  • Moderate: The computers in the previous categories are fine to learn with but are rarely used in professional development environments. The most popular computers in this category are $600 lightweight PCs called ultrabooks and made by Dell, Acer, and Asus, and the $900 MacBook Air. These laptops have high-resolution screens with sharp contrast and crisp colors, important features when coding website or data visualizations.
  • Expensive: The standard machines used in professional development environments have at least a 21-inch resolution screen, 8 gigabytes of RAM, 500-megabyte hard drive, and 2GHz dual-core or quad-core processors. Some Windows PCs meet these specifications, but most popular among developers are the MacBook Pro laptops and the iMac desktop computers, both of which cost at least $2,000. Apple computers are popular in this category for several reasons:
    • Display: Apple’s retina display screen has such a high resolution that the individual pixels are imperceptible to the human eye at an average distance with normal vision. This high resolution gives Mac displays a strong advantage when doing visual work.
    • Hardware: Developers who use the Linux or Unix operating system often have to deal with hardware devices (such as graphics cards, sound cards, or USB ports) that don’t install or function properly. The Mac operating system, which runs a version of Unix, has few hardware issues because all parts are manufactured and tested by Apple.
    • Software: Mac computers are preinstalled with the most popular programming languages, including Python, Ruby, PHP, and Perl. In addition, for mobile apps, you can use a PC or a Mac to develop Android apps, but you can use only a Mac to develop apps for iOS devices such as iPhones and iPads.
image

Figure 9-1: Google Chromebooks pack enough power to do serious coding.

warning When learning how to code, you likely don’t need the best or fastest computer. If you do decide to purchase a higher-end computer, remember that the majority of people using your programs won’t have a computer as fast or a monitor with as high-resolution as you. Developers who forget this create websites and visualizations that others find slow or difficult to read.

Computer software

After you have a computer, you need to install software to help you write computer programs. The software is basically free, though it can take longer than expected to make sure it installs correctly.

Initially, you should install the following types of software:

  • Programming languages: Popular programming languages such as Rails and Python are used for everything from web development to data analysis. These languages are usually free to download, install, and use. Use a search engine to find installation guides for the Windows, Mac, or Linux environment.

    tip To install Ruby, Rails, Git, Sublime Text, and more on Windows, Mac, or Linux machines, use the guide at installrails.com. Thousands of people have used this guide; if you get stuck, check out the comments at each step.

  • Code editors: You can start programming right away with built-in applications such as Notepad on Windows and TextEdit on a Mac. Notepad and TextEdit were not designed for coding, and other code editors provide enhancements such as code syntax highlighting and code autocomplete such as Notepad++ on a PC, Text Wrangler on a Mac, and Geany on Linux environments. To develop mobile applications, you can download and use XCode from Apple for iOS apps, or Android Studio from Google for Android apps. All of this software is freely available for you to use.

    tip Some popular and useful code editors are not free. Sublime Text (www.sublimetext.com), which sells for $70, works across multiple platforms and includes advanced editing, highlighting, and code completion features. You can download and trial an unrestricted copy before purchasing. Another code editor is Cloud9 (c9.io), which you access in the browser without downloading anything. The main advantage here is that everything is automatically updated, always works, and you can access your work and code from any Internet-connected machine. Cloud9 has a free plan, and paid plans start at $9 per month.

  • Versioning software: Whether working alone or in team, it can be useful to save backup versions of your code and merge changes and updates from others working on the same program. Git (git-scm.com) is a popular free tool to manage backups, versioning, and multiple versions of code when working on a team.

tip Free cloud-based services interact with Git to back up your code on the Internet. Popular providers include Github.com and Bitbucket.com. Both allow you and others to view and update code you publicly post.

Learning to Code Online and Offline

An incredible number of resources are available for learning how to code. Do a Google search for learn to code, and you will find millions of websites and more content than you could ever consume. To not feel overwhelmed, first ask yourself what kind of coder or coding job you want. Would you like to learn to be a

  • Front-end developer: Create the look, feel, and appearance of websites accessed on desktops or laptops.
  • Back-end developer: Write the behind-the-scenes code that supports functionality and features visitors use on your website.
  • Mobile developer: Build apps for smartphones and mobile devices.
  • Data analyst: Analyze data, and generate insights to improve outcomes.
  • SEO specialist: Improve how search engines find and index websites.

This section presents resources you can use to learn more about each of these subject areas.

Using blogs and books

Traditionally, a self-learner used blog posts to dip a toe into a topic, and books to dive deeper into a programming language. Blogs highlight inspirational stories that document people’s journeys, and books serve as valuable reference tools. The following are some favorite blogs and books in each subject area:

  • Front-end and back-end development:
    • blog.jenniferdewalt.com : An artist by trade, Jennifer Dewalt (see Figure 9-2) learned to code by building a different website every day for 180 days, writing a blog post about it, and posting the code publicly on GitHub. On day 52, she created an Etch a Sketch program; on day 97 she created a text-to-Braille converter.
    • joshuakemp.blogspot.com : Joshua Kemp, a blacksmith, seriously injured his hand while shoeing a horse. He decided to learn to code, and wrote about going from a blacksmith to a developer.
    • HTML and CSS by John Duckett: For front-end developers, this full-color book is the number-one programming book on Amazon and a good introduction to what you can do with HTML and CSS.
    • learncodethehardway.org : Zed Shaw has written two books for back-end developers titled Learn Ruby the Hard Way and Learn Python the Hard Way. Both, which are freely available online, provide instructions and real coding examples aimed at beginners.

      tip For a community-sourced list of all freely available, online programming books, visit http://github.com/vhf/free-programming-books. The list covers over 25 programming languages and environments, so focus first on the popular and easier languages such as HTML, CSS, Ruby, and Python.

  • Mobile development:
    • app.itize.us : Half the challenge when creating a mobile app is cramming the functionality you need into a small mobile screen. Visit this site for a curated selection of the best-designed apps.
    • twotoasters.com/blogs/ideas : TwoToasters creates mobile apps for some of the largest brands in the country. They maintain an iOS and Android blog on industry news and programming tidbits.
    • The Swift Programming Language by Apple, Inc.: Apple recently released a new programming language, and new and experienced developers alike are learning how to use it. This free book, which can be downloaded from iTunes, is long but a good place to start.
  • Data analytics:
    • Visual Display of Quantitative Information by Edward Tufte: Finding great insights is most powerful when you can communicate them effectively. This classic book has no code but shows the different ways data can be graphically displayed.
    • Python for Data Analysis by Wes McKinney: Data analysis always starts with cleaning, merging, and transforming your underlying data. This book shows you Python techniques to whip your data into shape so you can analyze it.
    • IBM Big Data Hub: Available at ibmbigdatahub.com/blogs , IBM’s blog has consistent coverage of big data trends, industry news, and the latest technologies.
  • Search engine optimization:
    • Moz: Available at moz.com/learn/seo , this blog is the best place to go to start your SEO education. You’ll learn all the factors that influence search rankings.
    • cutroni.com : To track and measure the effectiveness of any SEO campaign, you need an analytics tool such as Google Analytics. Google’s Analytics Advocate blogs about cohort analysis, user identifiers, and other analytics-specific topics.
    • The Art of SEO by Enge et al: The authors have been doing SEO work for decades and provide general advice along with specific suggestions for updates made to search engine algorithms.
image

Figure 9-2: Jennifer Dewalt on day 180 after building her 180th website.

Learning from online websites

With the demand for coders so high, many companies have created websites with engaging and interactive experiences that are easier to complete than just reading a blog post or a book. Some sites gamify the experience, encouraging you to keep learning by earning points and badges. Most sites have community support, which can include discussion boards, live chat, or tutors to help when needed. The cost for these services varies per website; some are free and others charge a monthly or per-course fee.

When choosing a resource, check how much content is on the site, whether the materials are up-to-date, and the level of community engagement. Nothing beats having a strong online community to answer your questions quickly, and nothing is worse than spending hours trying to debug a problem with your code only to discover that the website you were using had a typo in the instructions.

Here are some favorite online websites in each subject area:

  • Front-end and back-end development:
    • codecademy.com (free): Learn basic web programming languages to create complete websites from front end to back end (see Figure 9-3). You can start immediately with only a web browser; you don’t have to download or installing any software.
    • codeschool.com ($29/month): Initially, Code School became popular with its Rails for Zombies series, but the site also has a niche among intermediate developers. The site features video lessons with in-browser coding challenges for a wide range of programming topics and languages. There are also screencasts (recoded coding sessions) with guest speakers teaching various skills.
  • teamtreehouse.com ($25 or $45/month): Treehouse has a slightly larger content library than Code School, and includes all the usual front-end and back-end courses along with mobile app courses for iOS and Android as well as business classes on how to freelance and market your app or business.

    tip Bento (bentobox.io) is a community-sourced curated listing of the best free resources for learning how to program and, most importantly, the order in which to take these topics to maximize your learning. The site has grown to include over 100 lessons on programming languages, frameworks, libraries, and APIs.

  • Mobile development:
    • Stanford’s Developing iOS 8 Apps (free): Stanford’s School of Engineering has released on iTunes an online course with over 20 hours of instruction and slides so you can learn to code apps for iPhones and iPads. Go to itunes.apple.com/us/course/developing-ios-8-apps-swift .
    • Intro to iOS App Development by Udacity (free): Video lectures teach Swift programming by building an app that records your voice and then transforms it into Darth Vader or a chipmunk. Visit www.udacity.com/course/ud585 .
    • Android and Swift Immersive by Bitfountain ($150): These two separate courses each have over 300 videos on developing iOS and Android apps. Available at bitfountain.io .
  • Data analytics:
    • datasciencemasters.org (free): This open-source data-science curriculum has curated free and paid online courses, books, and tutorials.
    • Introduction to Data Science (free): Hosted on Coursera (see Figure 9-4), and taught by the University of Washington, this online course covers introductory big data concepts, along with data analysis and visualization. Available at www.coursera.org/course/datasci .
    • datacamp.com (free to $25/month): This interactive online course teaches you R, a statistical programming language, in the browser. Courses include introductory lessons to advanced data manipulation and visualization using R and specialized libraries.
image

Figure 9-3: Codecademy helps you to build the Airbnb homepage.

image

Figure 9-4: Coursera data science course analyzing 2012 presidential election data.

tip Find a curated list of 250 free online video courses across a variety of coding topics from universities such as Stanford, MIT, and Princeton by visiting Class Central, available at www.class-central.com/subject/cs .

Adding support with mentors

As you can see, there is no shortage of content or coding topics to learn. As you start your path down any one of these roads, you’ll have questions, get stuck, or just need encouragement. Although you are learning by yourself, you can find mentors to support you on your journey and help you make progress.

Mentoring can be expensive, but the cost depends on how much time and assistance you need. If you’re taking a Codecademy course or viewing a lecture on Coursera and need an hour or two of ad-hoc help occasionally, check out these hourly services to connect with a mentor:

  • airpair.com : Over 2,000 expert developers are available to help you debug and review your code. Experts set their own rates, which range from $60 to $300 per hour.
  • codementor.io : Experts in over 800 categories, including HTML, JavaScript, and Ruby, connect with you instantly for one-on-one help. Rates start at $10 for a 15-minute session, and the website displays experts who are online and available to help. (See Figure 9-5.)
  • hackhands.com : Users pay $1 per minute for on-demand help across a variety of programming languages. After you connect to an expert, you have an initial 5-minute grace period at no charge to assess whether the expert is the right person to assist with your problem.
image

Figure 9-5: Expert coding mentor services provide live video, chat, and screen sharing.

You may want to occasionally ask for help from mentoring sites such as AirPair. Expert-led coding instruction typically involves a curriculum along with mentor check-ins, office hours, a discussion group, and live chat. These fuller and more supported services work well if you have some money to spend on your coding education but don’t want to pay $10,000 for a high-intensity coding boot camp (discussed in Chapter 10).

Some options for mentor-led coding instruction include the following:

  • thinkful.com : Along with courses in web development, design, data science, iOS, and Android programming, Thinkful matches you with a mentor for weekly 45-minute sessions and offers open office hours. Students pay $500 per month, and typically finish one subject in three months.
  • careerfoundry.com : Similar to Thinkful but with fewer classes, CareerFoundry has a custom curriculum for web development and design, along with weekly mentor sessions and a group chat. The course includes 12 mentor sessions and costs $1,680.
  • bloc.io : Bloc has programs in web and mobile development as well as design. The fee is $4,500 per course and includes 36 mentor sessions over 12 to 36 weeks.

Staying on Target to Achieve Your Goal

You have a computer, found a website, and even did a few lessons, but you feel stuck. Learning anything on your own, especially coding, can be tough! It’s easy to lose motivation, get frustrated, feel confused, and spend way more time on a concept or topic than you had planned. All these feelings are normal when learning a new subject.

This section provides some tips to keep your learning on track and a process to help you get going again when you’re stuck.

Pick a language, any language

As a novice coder, you may not be sure where to start. Should you learn Python, Java, Swift, Ruby, PHP, and JavaScript at the same time or sequentially? Or should you just choose a few?

If you’ve never programmed before, I recommend learning a language used to create web pages, because it’s easy to get started and publish work for others to see. Start with HTML and CSS. These are markup languages, which are the easiest to learn. You put content on a web page with HTML, and style that content with CSS.

After you understand some of the basics of presenting content, learn a programming language to manipulate that content. Keep in mind that you don’t need to learn every programming language — JavaScript, which adds interactivity to a web page, is a common starting point for beginners, along with either Ruby or Python, which add advanced features such as user accounts and logins.

Learning to code is similar to learning to drive a car. When you first learned to drive, you probably didn’t worry too much about the type of car you were driving. After passing the driving test, you could operate just about any car, even one you hadn’t driven before, because you knew to look for the ignition, accelerator, and brake. Learning a programming language works the same way: After you learn one language, you know what to look for, and learning and using another language becomes easier. Just start somewhere!

Define a goal

To stay motivated, create a concrete, well-defined goal. You can choose any goal you like, but make sure it’s something you would be excited to accomplish. Good goals for beginners include the following:

  • Build your coding vocabulary so you can understand what developers or designers say in meetings at work.
  • Create a small website — consisting of one to four different pages — for yourself, a business, or a group.
  • Analyze a public data set that is too large for Excel (such as all the subway riders or cab riders in New York) and create one simple graph. This type of data is freely available and low-stakes, and you can check your work against blog posts written by others who have used the same data set.

tip Tilt the odds in your favor by making your goal SMART. You’re more likely to accomplish any goal that is specific, measurable, attainable, realistic, and time bound.

You can start practicing by doing small coding tasks, such as bolding a headline. At first, you may feel disconnected from your goal. But as you start to piece together individual coding skills, you’ll see a path towards accomplishing your goal.

tip It can be difficult to know whether your goal is easy and attainable or too hard. Use a search engine to type your goal with tutorial at the end. If you can’t find any short and easy-to-read tutorials on the subject, try choosing another goal.

Google is a coder’s best friend

At some point, you’ll get stuck — your program won’t run, or it runs but returns incorrect results. Professional developers face these same problems. Developers constantly use the Google search engine to research general questions on how to code a feature or specific questions on syntax for a command or a tag. For example, imagine that a few months from now, you need to add an image to a website. You remember that HTML has a tag to insert images on a website, but you don’t recall the syntax. To quickly and efficiently find the answer, follow these steps:

  1. Go to www.google.com.
  2. Search for HTML image syntax.

    The programming language, the intended command, and the word syntax should be sufficient to find a good set of resources.

  3. Review trusted websites for answers.

    For many coding questions you’ll likely see the following domain names in the top ten search results:

    • www.w3schools.com is one of the best resources for beginners who want to find basic information on developing web pages.
    • https://developer.mozilla.org is a crowd-sourced documentation and tutorial site for developing web pages. Its documentation is accurate, although some content is not beginner friendly.
    • http://stackexchange.com and http://stackoverflow.com are crowd-sourced discussion sites where developers can ask and answer questions about a variety of coding topics. You can find information on everything from front-end and back-end web development to data analysis and operating systems.

You can use this same process to research questions in other coding languages, or to find code examples from other developers who are building programs similar to yours.

Zap those bugs

While you’re doing all this coding you will inevitably create errors, commonly referred to as bugs. There are three types of errors:

  • Syntax errors occur when you write invalid code that the computer doesn’t understand. For example, in CSS, you write color: blue; to change the font color of text. If you wrote font-color: blue; instead, you’d generate a syntax error because font-color is an invalid property.
  • Semantic errors occur when you write valid code that has an unintended effect. For example, trying to divide a number by zero is a semantic error in JavaScript.
  • Logic or design errors occur when you write valid code that has the intended effect, but the code produces the wrong result. For example, in JavaScript, converting miles to feet using var miles = 4000 * feet is a logic error. Although the code is written correctly and does what the programmer wants it to do, it still produces the wrong answer because a mile consists of 5,280 feet, not 4,000.

Some programming languages such as HTML or CSS code work even in the presence of syntax errors. However, in other programming languages, such as JavaScript, code with syntax errors won’t run.

The best way to find and eliminate bugs is to first check your code syntax and then check the logic. Review your code line by line, and if you still can’t find the error, ask another person to take a look at your code, or post it on an online community forum such as http://stackoverflow.com.

Just Ship It

When you start coding, you will likely be reluctant to show others your creations, whether it’s your first basic website or something more complex Reid Hoffman, the founder of LinkedIn, famously said, “If you are not embarrassed by the first version of your product, you’ve launched too late.” Hoffman was commenting on this desire to keep trying to perfect what you have built, and says instead to release (or “ship”) your code to public view even if you feel embarrassed. Regardless of the size of your website or app, it is better to receive feedback early and learn from your mistakes than to continue heading in the wrong direction.

Also, remember that the highly trafficked, highly polished websites you use today started from humble beginning and simple prototypes. Google’s first home page, for example, had only a fraction of the functionality or style of its home page today, as you can see in Figure 9-6.

image

Figure 9-6: Google’s original home page in 1998.

Collect Feedback

After you finish coding the first version of your website or app, collect feedback on your code and on the final product. Even if everything is working and your website looks great, that doesn’t mean your code was written correctly or that your site solves a problem. For example, YouTube initially started as a video-dating site but changed to a general video-sharing website based on user feedback.

The best way to obtain this information is to collect quantitative and qualitative data on your code and the product. For example, measuring the places where visitors click on a website and how long they stay on each web page gives you quantitative information, which helps you diagnose and improve low performing pages. You can collect qualitative information by surveying users, either by emailing them survey questions or by watching people in-person use your website and then asking questions.

Often this data will surprise you — users may find confusing the features you thought were obvious and easily understood, and vice versa. Similarly, if possible, have someone examine your code, in a process called a code review, to ensure that you didn’t overlook any major problems.

Iterate on Your Code

After you’ve collected feedback, the next step is to iterate on that feedback: Keep coding until the major issues in your feedback have been addressed and you have improved both the code and the product. Keep in mind that it’s usually best to confirm the usefulness of your product first, before spending time improving the code.

This process — building a product with a minimum set of essential features, collecting feedback on the product, and then iterating on that feedback — is sometimes referred to as a lean startup methodology. These days, changing software is as simple as modifying a few lines of code in real time. This contrasts with the way products used to be coded, which involved longer development cycles, less upfront feedback, and documentation for any software change in the product.

tip Just like with document drafts, save the old versions of your code. You might realize that an older version is better, or you might want to debug the current code by using an older version.

Share Your Successes and Failures

While coding, you may have come across documentation you found confusing or just plain wrong. Maybe you found a great resource or a tool that worked especially well for a product you were building. Or perhaps the no one used the features you coded, and you had to give up the project.

In all these situations, the best thing you can do for yourself and the larger community is to blog about your successes and failures. Blogging benefits you because it shows others the issues you’re thinking about and trying to solve. Similarly, blogging benefits others who used Google to search for and read about your experiences, just as you used Google to search for ideas and solve problems. Many nontechnical entrepreneurs, such as Dennis Crowley of Foursquare and Kevin Systrom of Instagram, taught themselves enough coding to build small, working prototypes and successful products, and then shared that journey with others.

Writing about your failures is important too. An honest account of what you learned will generate support from others and may reach a wider audience than those who initially used your product. For example, the CEO of Earbits, a music-streaming service for independent artists, wrote a blog post about shutting down the service after four and a half years and their failure to find a working business model. Within three days, his post became so popular than an investor stepped in to allow the company to operate indefinitely. See the original blog posts at blog.earbits.com/online_radio/earbits-will-be-shutting-down-june-16th.

tip You can blog for free and share your experiences using blogging sites such as WordPress (www.wordpress.com), Blogger (www.blogger.com), or Tumblr (www.tumblr.com).

..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.133.108.68