Skip to content

Building Inquiryweb 1 hour at a time

January 23, 2012

Last week, I posted about an idea I’d had for Inquiryweb, a web app designed to aid the inquiry process in class by tracking questions, observations and answers.

The response I got from readers was tremendous. You helped me see completely new uses for this application, envision great new features, and gave me tremendous advice on getting started. Again, the blog-o-twitterverse comes through in a big way. So I’ve decided to try to make this a go. I’m going to make my “one hour of learning” devoted to trying to make Inquiryweb a reality.

I first should confess my lack of expertise as a programmer. 12 years ago, I took a class in software design, and at one time, I had decent enough chops to write a 5000 line program to seat students randomly in our dining hall for sit-down meals (I even figured out the STL for that one). Since then, I’ve become quite rusty, and now am mostly content to play around with Python and get bored with Codecademy (I’ll blog more about that later).

But lots of what I’ve read (and Riley Lark) say Django and Python are the new hotness in web app development, so I spent the past week working all four of the lessons in the Django tutorial—I can make a poll-wow. I also spent most of the weekend trying to configure mySQL and Django to play nicely on my machine, which wins the cake as the most un-mac-like experience I’ve ever had on a mac. Thanks to MacPorts, an awesome package installer for mac (can you say sudo port install python27-mysql) and and lots of help from Stack Exchange, I’ve gotten everything working.

I’ve also put together what I think should be a vision for version 0.1 of Inquiryweb. I’d like a super simple web front end that can allow the user to enter a question very simply with one click. Questions should be associated with authors. Three other classes I think I will need are observations, predictions and answers. The couple of CS classes I took long ago tell me that somehow these should all be subclasses of some inquiry class, but I haven’t gotten that far yet. In addition to being able to view a particular inquiry type (question, observation, etc), you should be able to view all the inquiries made by a particular author).

Basically, I’d love Inquiryweb to make it easy to enter these questions and predictions from Brian Franks inquiry class in almost real time, and then export them out in a list to paste into a blog.

I did manage to put together a very basic UML document laying out the 5 classes I’ve thought of. And that’s about as far as I’ve gotten in terms of design:

View this document on Scribd

As for real coding, I’ve entered these five basic classes into the document, and used it to setup the mySQL database, and that’s it. This isn’t going to be a quick process, for sure.

I also did manage to figure out github, and have now created a public repository for this project. I’m going to use the github site to track my progress on developing this app, so that my readers who aren’t interested in my efforts to become an edu-startup aren’t bored to tears.

Future plans include:

  • Writing out much more of the design doc
  • setting up my mac mini with a static ip (dyndns?) so that I can use actually deploy and test inquiryweb on it.
  • Setting up google app engine to run inquiryweb, if I want to be really cool and try to scale this idea.
  • Trying to modify the tutorials to see if I can create my own admin interface.

So here’s where I’d love more feedback and suggestions from the my super cool social media coding cheerleaders. Where have I gone off the rails? Are there resources I should be checking out? Pitfalls to avoid? Really, any help would be most appreciated.

15 Comments leave one →
  1. January 24, 2012 12:30 am

    If you want it to run on Google app engine, check out the available documentation on Django on Google app engine ( ) so that you don’t have to make too many porting changes after the fact. Django on Google app engine requires a fork of Django ( )that runs on a non-relational database, and it doesn’t have joins. This may affect the logic of some of your queries, but I don’t have enough experience with it to advise you further.

  2. Ternistato permalink
    January 24, 2012 3:19 am

    If you are not too far with coding, consider alternatives of Django: try ASP.NET (MVC) for example; it’s a good framework, easy to learn, that makes development and testing quite easy. Also, the C# language allows you to write a clean code. Used with Visual Studio, your programming productivity will be very high. I guess that you just need a virtual Windows machine in order to use that.

    Also, before you even start serious coding, think of writing a maintanable code because your idea sounds good and can be developed and improved as time goes on.

    And, probably the most important thing, don’t forget about the usability of your app.

    • January 25, 2012 9:29 pm

      Thanks for the advice. Yes-looking back at some of my previous projects, maintainable code is key. Since I’m coding on a mac, I’m not really sure I want to go through the hassle of starting up parallels everytime I want to write code.

      • Ternistato permalink
        January 30, 2012 11:08 am

        Even more, software engineering is the key to a successful software. I think that you should really try to focus more on software engineering before starting a serious work on this project.

        It is very important to have every part of your software under control; otherwise, it can become quite a mess to develop a good, usable software.

        Good luck and keep us updated. If you need any help, we are here.

  3. npisenti permalink
    January 24, 2012 5:39 am

    I would suggest checking out heroku (for example: I’ve used them for several Ruby on Rails apps, and deployment has been an absolute breeze. Also, they’ll host your app for free (even at a custom domain name) as long as you don’t have too much traffic, which may save you the headache of hosting on your own server.

    • January 25, 2012 9:30 pm

      Thanks for the tips. I’ll definitely check them out.

    • npisenti permalink
      January 29, 2012 10:14 am

      Also — if you want to tie into SMS messaging (so, for example, students can text in questions at any time of day without needing access to a computer), I would check out the Twilio API. I haven’t used it yet, but looks super cool and easy to use:

  4. January 24, 2012 7:48 am

    Certainly sounds like an adventure. I like the idea of the inquiry web app. Do you think it is doable given the other commitments? If so, can we talk about how the CFT can support your efforts in this area? I could push some resources your way and give you back end support. Let’s talk.


  5. January 28, 2012 10:08 pm

    Ok, I’m hooked. I don’t know anything about Python or Django, and it’s been years since I used UML, but my C is in pretty good shape and database normalization is my first love. Let me know if there’s anything helpful I can do.

    In the UML above, it looks like all the relationships are compositions (ex.: a prediction is a part of an author) rather than aggregations (a prediction is held by one or more author). Did I read it right? The way I see it, aggregation would make more sense, if only because a prediction can be made by more than one author (although not by zero authors). Similarly, questions should probably aggregate predictions (a question can have zero, one, or more predictions) as well as observations and authors, since more than one person might be asking the same question.

    What about answers — do you want to allow more than one “answer” to be accepted for a question? Ideally, it would be helpful if it did, since sometimes there are several answers that are applicable in different circumstances, and it would allow us to track the ways answers change over the course of a semester. Answers could fairly easily have a property of “accepted” to indicate if this is the current canonical solution.

    Does it make sense to have a class of “Topics”? This might give you a way to identify questions by category. Topics could also provide a link to standards, or course numbers, or grading periods, or what have you. In my case, it would also be helpful to have a class of “Resources” that allows us to keep track of info we looked up. Otherwise, the only way info can enter into the picture is if it is directly observed. Or maybe there’s no need to distinguish between what we measured ourselves and what someone else measured, as long as we attribute authorship to the writer, blogger, videographer, etc. whose work we are referring to?

    Going back to the big picture… what is the goal here? The goal isn’t typing up Brian’s classroom data, since there’s no reason to do that unless it will be used for something. Is the goal for students to determine how much work they have left to do? Or for instructors to keep track of which questions were most popular (generated the most activity) and therefore should be asked again next semester? Or for instructors to help students prioritize questions? Whatever that is, the sooner it is clarified, the sooner it can begin providing insight.

    I’m also a big fan of designing the user interface before coding. Sketches on paper are good. This can also clarify a lot of questions very quickly.

    Ok, yet another marathon comment comes to a close. Hope some of this is helpful.

    • February 1, 2012 12:03 am

      Thanks again for the incredible feedback. I’ve tried to write up a bit more of the design doc (still working on it) and post it to the github site. I think I’ll try to post some occasional updates here, but I’ll put most of the stuff related to this project on github.

      Regarding a few of your questions:

      1. I suck at UML, but I think I was trying to show that they are aggregators—each answer has a question, and each observation has an author.
      2. I certainly want to allow for one or more answers. Voting would be even cooler, so that in a sort of stack exchange way the class could vote up answers and even possible close particular questions.
      3. I like the idea of topics, but I’m wondering if tags might do the same thing. I guess it would be relying more on the user to have a proper nomenclature for tags
      4. To me the purpose is to organize inquiry. To be able to ask “Hey, what did student X ask about on Monday?” or “Where do we stand on question y?” and actually be able to find the answer by browsing the inquiryweb. I think it’s also setting up a framework for organizing the class’s knowledge, making a sort of encyclopedia of inquiry. On the instructor side, I think it would be a useful measure for seeing how a particular student is contributing to the class, or what questions still aren’t being understood because no useful answers have been submitted.
      5. I’m playing around with the user interface. As in, I’ve found a free site to generate mockups and I’ve created a mockup on the most basic question asking page. You can find that on github too.
  6. January 28, 2012 11:37 pm

    I noticed from that you are making progress.

    Since there is so much shared between your models, I would propose a change to a single Event model, with each new event being able to refer to a previous one or more. This would allow you to make use of the “choices” functionality and especially the administration interface. Here’s a mockup. Sorry if I made a mistake, as I’m rather rusty.
    from django.db import models
    # use or something else for tagging?

    class Author(models.Model):
    firstName = models.CharField(max_length=25)
    lastName = models.CharField(max_length=25)
    # email address?
    # adorable picture?
    def __unicode__(self):
    return self.firstName + u” ” + self.lastName

    (‘Q’, ‘Question’),
    (‘P’, ‘Prediction’),
    (‘O’, ‘Observation’),
    (‘E’, ‘Explanation’),
    (‘M’, ‘Model’),
    class Event (models.Model):
    pub_date = models.DateTimeField(‘datepublished’)
    author = models.ForeignKey(Author)
    referants = models.ManyToMany(Event)
    event_type = models.CharField(max_length=1, choices=EVENT_CHOICES)
    description = models.CharField(max_length=300)
    tag = models.ManyToManyField(Tag) # FIXME
    def __unicode__(self):
    return self.event_type + u”. ” + self.description

    • January 29, 2012 8:59 am

      Whoa! Thanks so much. I’m such a newbie that I didn’t know about the event model, but this is very helpful.

  7. March 27, 2012 4:20 pm

    Ok, I couldn’t stop thinking about this idea so I tried it on Mindomo to see what would happen. It’s been helpful and interesting. I show this on the projector during class so we can use it as a reference (a wireless mouse is my new best friend — I pass it to whoever has the floor, so that they can use it to point to evidence that supports their point). The best part was seeing the students’ faces when I first showed it to them. They were stunned at the sheer volume of what they’ve accomplished since September.

    2011 Model

    The map is currently visible to the public but can only be edited if you are logged in to Mindomo. Mindomo has lots of useful keyboard shortcuts and editing tools (including comments). For anyone who’s curious and would like to experiment with editing this, let me know your Mindomo account name (they’re free) and I will share this map. All student details have been removed.

    • March 27, 2012 6:53 pm

      Thanks so much for posting this and keeping this idea alive. I’ve gotten a bit swamped with work, but I don’t want to let this project die, so I’m going to try to spend more time on it this weekend. Your experience with this mind map tells me that this really could be valuable in the classroom.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: