Friday, May 2, 2014

Closing Thoughts

Most people enter into an endeavor expecting a finished product – something quantifiable to show for their weeks, months, or years worth of labor.  Even those observing them, whether casually or professionally, look for tangible results.  We live in a society where output is praised and admired, but the lack thereof is met with confusion or disdain.  One of the most significant lessons I’ve learned during the course of this internship is that, while the destination can be important - finishing a product or meeting your goals - often the journey there is more lastingly valuable.



My mentor and I set out to design and implement an interactive application in the Canvas learning system that creates customizable practice quizzes and exercises for college intro-level Math students.  Right now, a professor can create a test bank in Canvas and upload his/her own hand-made problem sets of any given size.  Canvas then generates “random” quizzes from these test banks, but there’s no real student input or feedback as to what they need more practice in.  We wanted to give the student the option to select a topic, range of difficulty, number of problems, and specific features regarding those problems.  For instance, a student could say, “I really need more practice factoring polynomials.”  They could log into Canvas and select easy, medium, or hard factoring problems, whether they wanted single or multi-variable polynomials, and how many problems they wanted to practice.  This application would act as a supplement to their current coursework – a way to catch up if they were behind, review their weakest areas for exams, or look ahead if they were nervous about upcoming material.  

It's easy to bite off more than you can chew


I’ve been told by several of my friends and colleagues that setting realistic goals and outlines for a programming project is one of the most difficult factors.  Often software developer teams are initially too ambitious and will have to significantly scale back their project features halfway through in order to meet their deadlines.  But, we were optimistic.  We figured that our concept was challenging but workable in the span of a five-month internship.  Our first step was to download the proper software and register for developer permissions in order to edit and submit code in Canvas.  This took two weeks.  Our next step was to work through some learning modules provided by Canvas developers to teach others how to create interactive LTI applications that could be hooked up to Canvas.  


This involved implementing security checks for parameters sent from the user, signature verification, and finding or creating a library to carry out all these functions.  This process lasted over two months.  We had reached the point where the semester was drawing to a close and we had no tangible product to show for our efforts.  By the end we developed a simple piece of code to generate random single-variable polynomials, print them to the web browser, and check the user’s input of their roots against SymPy’s factoring method to spit out a result, but it was nothing close to what we had envisioned at the beginning of the semester.


At first our project seemed like a failure – we had worked so hard and yet were unable to meet any of our previous goals.  But then I looked back on the entirety of the semester and realized how valuable my work would be going forward.  I’ve learned how to create simple programs in three new languages.  I know how to get a local server running and mount files to that server to display on a web browser.  I have access to a plethora of resources to seek help when faced with a seemingly insurmountable obstacle or daunting error message, and I’ve learned the basic techniques of gathering and processing user input from a web form.  These all may seem like trivial concepts on their face, but they have taken months to learn and implement in their most basic form, giving me a much more realistic perspective and deeper understanding of what is involved in web development. 

 


Even though our finished product is not at all what we expected, I have walked away with programming skills that will be invaluable to me in the future – skills that I could only pick up through direct, hands-on experience in the field.  Working with my graduate mentor, Itamar Gal, has also made the world of academia and the people associated with it more accessible – not just in the context of potential graduate school opportunities, but also to mold my undergraduate career into a more worthwhile experience.  If I am interested in a particular topic, want to learn more about a given field of study, or just want to discuss some concept that I’ve recently discovered, I know now that there are professors, graduate students, and even some undergraduates that would enjoy a lively discussion.  I feel more at ease interacting in the academic sphere.  Through this internship I’ve gained a sense of belonging and right – a sense that I am worthy of the knowledge I have gained and the encouragement to share that knowledge with any willing ear, which to me is the most valuable piece of all.  

Week 15: Final Countdown, First Prototype

In our last week of this internship, we were able to incorporate our Python script that generates random, single-variable polynomials within a given coefficient range with AJAX, MathJax, and Sympy to create our first prototype of our interactive app.

We started by tweaking the AJAX tutorial to fit our needs.  With it we were able to create interactive buttons to display different polynomials and take user input from a text box and submit it to be checked.



This was done through a combination of coding in Python with Sympy imports, Javascript that used Mathjax source code to display polynomials in a more readable format, and HTML to interact with the user. 

Our app continued to develop into a more straightforward and usable layout. 


Finally, with a bit of code cleaning on my mentor's end, our first prototype looked like this: 


It currently grabs a randomly generated polynomial from our Python script, displays it with MathJax, then takes the user input of the polynomials derivative, checks it against the derivative calculated by Sympy, and displays feedback.



Since the semester is drawing to a close, this is currently as far as we will be able to develop our app.  If we were continue with this project in the future, we would add more features to make the webpage more user friendly, expand the apps functionality to perform several operations for diverse practice problems, tweak the interface to invite more user personalization (difficulty level/number/number range of problems). 






Week 14: Mad Dash to the End

Last time we developed a short program in Python to generate random, single-variable polynomials within a given range of coefficients.  Our next step was to incorporate that code into an HTML webform that could interact with the user.

We found an API called Jinja that we tried to learn, but with our limited time constraints, it was too intensive to work with.


Additionally, we found another platform called web2py that seemed more straightforward.  I was able to make a little more progress on that, but it was still too complicated for our time constraints. We were getting down to bare bones here!



Finally, my mentor found an AJAX tutorial that was just what we needed. It used a combination of Javascript and XML to create interactive buttons and text boxes.  


Next week we'll use this tutorial to incorporate our Python script.